Django:将上下文发送到'base.html'

时间:2017-12-19 19:52:41

标签: python django

我有一个用于注册/登录的导航栏项目。因为,它将在不同的页面中,我正在考虑在'base.html'中为每个页面“一次”调用此表单。

我发现了'上下文处理器'(Django - How to make a variable available to all templates?),但是,正如我所看到的,它只是在一个函数中将变量传递给所有模板(使用View类,使用get和post方法)。

为此,它在文件中使用类似这样的函数:

view.py

def categories_processor(request):
    categories = Category.objects.all()            
    return {'categories': categories}

但是,我在我的views.py中使用了Class Views,而且,通常,我确实传递了'request','url to be rendered','context'。像这样:

view.py

class RegistroClienteView(View):
    def get(self, request):
        ls_tipos_de_documento = TipoDocumento.objects.values_list('id', 'nombre_corto')
        form = ClienteCreationForm()
        context = {'form': form, 'ls_tipos_de_documento': ls_tipos_de_documento}
        return render(request, 'app_cliente/frontend/ingreso.html', context)

    def post(self, request):
        ls_tipos_de_documento = TipoDocumento.objects.values_list('id', 'nombre_corto')
        form = ClienteCreationForm(request.POST)
        if form.is_valid():
            form.save()
            context = {'form': form}
            return render(request, 'app_cliente/frontend/ingreso.html', context)

        context = {'form': form, 'ls_tipos_de_documento': ls_tipos_de_documento}
        return render(request, 'app_cliente/frontend/ingreso.html', context)

我的问题是在视图中返回什么内容?

按照设置'context-processor.py'的步骤后,在这个文件中,我有:

路径: app_cliente / context-processor.py

文件: context-processor.py

请注意,我只返回上下文

from app_cliente.forms import ClienteCreationForm
from django.views import View
from nucleo.models.tipo_documento import TipoDocumento


class RegistroClienteView(View):
    def get(self, request):
        ls_tipos_de_documento = TipoDocumento.objects.values_list('id', 'nombre_corto')
        form = ClienteCreationForm()
        context = {'form': form, 'ls_tipos_de_documento': ls_tipos_de_documento}
        return context

    def post(self, request):
        ls_tipos_de_documento = TipoDocumento.objects.values_list('id', 'nombre_corto')
        form = ClienteCreationForm(request.POST)
        if form.is_valid():
            form.save()
            context = {'form': form}
            return context

        context = {'form': form, 'ls_tipos_de_documento': ls_tipos_de_documento}
        return context

问题:

在我的urls.py中,此视图应该从哪个URL调用?

这是正确的方法吗?

更新1:

让我用评论中发布的这个例子澄清我的问题:

url(r'^any-url-i-want/$', RegistroClienteView.as_view(), name='any-name-i-want'),

在这里,RegistroClienteView.as_view()将呈现哪个模板???请记住,它只返回context_processor.py文件中的上下文。

2 个答案:

答案 0 :(得分:2)

您应该将return context替换为return render(request, 'PATH/TEMPLATE.html', context)

这也解决了你的问题,它呈现了哪个模板: - )

答案 1 :(得分:0)

要在base.html中设置导航栏模板,请创建templates/myapp/navbar.html,然后在

中创建

<强> base.html文件

...
include('myapp/navbar.html')
...

如果您想显示用户名,可以在navbar.html

中添加
{% if request.user.is_authenticated %}
{{ request.user.username }}
{% endif %}

如果要将其他数据添加到导航栏,请使用上下文处理器。

在视图中使用TemplateView来定义要使用的模板:

from django.views.generic import TemplateView

class RegistroClienteView(TemplateView):
    template_name = 'myapp/my_template.html'
    ...

最后如我的评论所述:

只要您传递视图,就可以设置所需的任何网址。如在

url(r'^any-url-i-want/$', RegistroClienteView.as_view(), name='any-name-i-want'),