我有一个用于注册/登录的导航栏项目。因为,它将在不同的页面中,我正在考虑在'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
文件中的上下文。
答案 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'),