Django variable in base.html

前端 未结 4 987
刺人心
刺人心 2020-11-30 04:35

base.html is used as the base template for all other pages. base.html has the navigation bar and in the navigation bar, I want to show the number o

相关标签:
4条回答
  • 2020-11-30 05:16

    You can use tags.

    #myproject/myproject/templatetags/tags.py
    
    from django import template
    
    register = template.Library()
    
    @register.simple_tag
    def number_of_messages(request):
        return _number
    

    In your Base.html

    {% load tags %}
        {% number_of_messages request %}
    
    0 讨论(0)
  • 2020-11-30 05:22

    Have a look at:
    https://docs.djangoproject.com/en/dev/ref/templates/api/#django.template.RequestContext

    As long as:

    • you use the render shortcut in your view (or otherwise take care to use a RequestContext to render your response)
    • have django.contrib.auth.context_processors.auth in your TEMPLATE_CONTEXT_PROCESSORS setting (as it is by default)

    ...then you have the current request's User (or AnonymousUser) instance available in your template as {{ user }} ...I am guessing from there you may be able to access the number of messages directly?

    Or perhaps you are using Django's messages framework?

    This comes with it's own context processor which (as long as you use render or RequestContext) will make a {{ messages }} var (containing the messages for current user) available in your templates. For 'number of messages' you can do {{ messages|length }}

    If none of these built-in options provide what you need you can either:

    • make your own template context processor which will run for every request and make additional variables available to all templates (when rendered with a RequestContext)

    • make your own template tag which can be used only where needed... of course if this is used in your base.html and all templates inherit from base.html then it's still going to run for every page.

    0 讨论(0)
  • 2020-11-30 05:27

    If you want the variable in really all the views, then a custom template context processor is probably the best option.

    https://docs.djangoproject.com/en/dev/ref/templates/api/#subclassing-context-requestcontext

    If you want the variable only in some of the views, then you can make those views call a common function that populates the common variables, something like this:

    def some_view(request):
        params = _common_params(request)
        params.update({
            # params specific to .some_view
        })
        return render_to_response('path/to/template, params)
    

    or create a custom decorator like this:

    from functools import wraps
    
    def render_with_params():
        def _inner(view_method):
            def _decorator(request, *args, **kwargs):
                params = _common_params(request)
                (template_path, view_params) = view_method(request, *args, **kwargs)
                params.update(view_params)
                return render_to_response(template_path, params, context_instance=RequestContext(request))
            return wraps(view_method)(_decorator)
        return _inner
    
    @render_with_params()
    def some_view(request):
        params = { ... }
        return ('path/to/template', params)
    
    0 讨论(0)
  • 2020-11-30 05:33

    I find the simplest steps to passing variables to your base templates in django is to add a context_processor.py file like so:

    In your app create context_processors.py and declare your variables e.g.:

    # context_processors.py
    def message_processor(request):
        if request.user.is_authenticated:
            no_msgs = request.user.profile.msgs
        else:
            no_msgs = 0
        return {
            'messages' : no_msgs
        }
    

    Then register your process or under TEMPLATES in your settings.py file:

    TEMPLATES = [
        {
            ...
                'context_processors': [
                    ...
                    # custom
                    'appname.context_processors.message_processor',
                ],
            },
        },
    ]
    

    And then you will be able to get that variable anywhere in your app as:

    {{ messages }}
    
    0 讨论(0)
提交回复
热议问题