Show undefined variable errors in Django templates?

后端 未结 8 876
长情又很酷
长情又很酷 2020-12-24 08:50

How can I ask Django to tell me when it encounters, for example, an undefined variable error while it\'s rendering templates?

I\'ve tried the obvious DEBUG = T

8条回答
  •  天涯浪人
    2020-12-24 09:18

    I am use next:

    import logging
    
    from django.utils.html import format_html
    from django.utils.safestring import mark_safe
    
    
    class InvalidTemplateVariable(str):
        """
        Class for override output that the Django template system
        determinated as invalid (e.g. misspelled) variables.
        """
    
        # styles for display message in HTML`s pages
        styles = mark_safe('style="color: red; font-weight: bold;"')
    
        def __mod__(self, variable):
            """Overide a standart output here."""
    
            # access to current settings
            from django.conf import settings
    
            # display the message on page in make log it only on stage development
            if settings.DEBUG is True:
    
                # format message with captured variable
                msg = 'Attention! A variable "{}" does not exists.'.format(variable)
    
                # get logger and make
                logger = self.get_logger()
                logger.warning(msg)
    
                # mark text as non-escaped in HTML
                return format_html('{}', self.styles, msg)
    
            # on production it will be not displayed
            return ''
    
        def get_logger(self):
            """Create own logger with advanced error`s details."""
    
            logger = logging.getLogger(self.__class__.__name__)
    
            logger.setLevel(logging.DEBUG)
    
            handler = logging.StreamHandler()
            handler.setLevel(logging.DEBUG)
    
            formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    
            handler.setFormatter(formatter)
    
            logger.addHandler(handler)
    
            return logger
    

    Usage in settings file (by default it settings.py):

    TEMPLATES = [
        {
            ......
            'OPTIONS': {
                .....................
                'string_if_invalid': InvalidTemplateVariable('%s'),
                .....................
            },
    
        },
    ]
    

    or directly

    TEMPLATES[0]['OPTIONS']['string_if_invalid'] = InvalidTemplateVariable('%s')
    

    A result if DEBUG = True:

    On page

    In console

    > System check identified 1 issue (0 silenced). October 03, 2016 -
    > 12:21:40 Django version 1.10.1, using settings 'settings.development'
    > Starting development server at http://127.0.0.1:8000/ Quit the server
    > with CONTROL-C. 2016-10-03 12:21:44,472 - InvalidTemplateVariable -
    > WARNING - Attention! A variable "form.media" does not exists.
    

提交回复
热议问题