在django/contrib/auth/views.py
中有注销视图的定义:
def logout(request, next_page=None,
template_name='registration/logged_out.html',
redirect_field_name=REDIRECT_FIELD_NAME,
current_app=None, extra_context=None):
我想添加extra_context来摆脱我注销时出现的'Logged out'标题
所以我在我的网址中尝试这个:
(r'^accounts/logout/$', logout(extra_context={'title':'something else'}) ),
但后来我得到这个错误:logout()至少需要1个非关键字参数(0给出)我做错了什么? ps:当我这样做的时候
(r'^accounts/logout/$', logout ),
它有效,但后来我得到了“退出”文字......
谢谢,弗雷德
当你编写logout(extra_context={'title':'something else'})
时,你实际上是在URLconf中调用logout
,这是行不通的。 Any URLconf tuple can have an optional third element, which should be a dictionary of extra keyword arguments to pass to the view function。
(r'^accounts/logout/$', logout, {'extra_context':{'title':'something else'}}),
或者,您可以编写自己的视图,调用logout
传递您想要的任何参数 - 这通常是在更复杂的情况下“扩展”基于函数的通用视图的方式。
添加我对django 2.0的发现作为此线程的上一个答案不再适用于最新的django版本。
使用2.0,将URL添加到urls.py文件的正确方法是使用path():
from django.urls import path
from django.contrib.auth import views as auth_views
path('accounts/logout/', auth_views.LogoutView.as_view(
extra_context={'foo':'bar'}
)),
要在此处突出显示的代码段是.as_view()函数。 Django 2.0将auth视图实现为类。您可以在Authentication Views documentation中阅读更多相关信息
然后使用`.as_view()将类“转换”为视图,并且可以将源代码中定义的任何类属性作为命名参数传递。
传入extra_context(默认为None)会自动将这些上下文变量公开给模板。
您可以通过以下python路径访问LogoutView的源代码:django.contrib.auth.views
在这里,您可以看到可以传递给LogoutView的其他类属性以及其他auth视图类。
我在django 1.11中遇到了与标题和通用视图类似的问题(虽然问题主要是我没有从2.0切换docs版本)。我想通过extra_context将title传递给从CreateView继承的视图,并发现django的通用视图没有这样的属性。所以,这是我的拐杖:
class ExtraContextMixin():
extra_context = {}
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context.update(self.extra_context)
return context
class CustomView(ExtraContextMixin, CreateView):
url(r'^custom-view/$', views.CustomView.as_view(extra_context={'title': 'just any'}), name='custom-view')
不幸的是,我不知道这样的解决方案是否可以接受(显然不需要2.0),但至少它是有效的。