我已经覆盖了我的视图类上的调度方法,因此它们需要用户登录.
例:
class IndexView(generic.ListView):
template_name='quotes/index.html'
context_object_name = 'book_list'
@method_decorator(login_required)
def dispatch(self, args):
return super(IndexView, self).dispatch(args)
def get_queryset(self):
"""Return all the book objects"""
return Book.objects.all()
class DetailView(generic.DetailView):
model = Book
template_name = 'quotes/detail.html'
@method_decorator(login_required)
def dispatch(self, request, args, kwargs):
return super(DetailView, self).dispatch(request, args, kwargs)
def get_queryset(self):
"""
Excludes any polls that aren't yet published
"""
return Book.objects.all()
Run Code Online (Sandbox Code Playgroud)
这很好用,直到我使用这样的URL模式:
url(r'^book/(?P<pk>\d+)/$', views.DetailView.as_view(), name='detail'),
Run Code Online (Sandbox Code Playgroud)
然后它给了我错误
dispatch() got an unexpected keyword argument 'pk'
Run Code Online (Sandbox Code Playgroud)
DetailView需要query_set函数的参数,但是调度正在捕获它并抱怨它.这件事发生在我之前.我删除了所有登录功能,不得不重新开始.我把它全部替换了,即使使用pk arg也能正常工作.现在它再次这样做,我在网上找不到任何理由.谁能帮忙.将发布您认为必要的任何其他内容.
我知道你可以在URL模式中添加login_required.我只是以错误的方式解决这个问题吗?Django文档提供了我正在使用的方法.
报价/ index.html的
{% extends "base.html" %}
{% block content %}
{% load staticfiles %}
<h2> Books </h2>
{% if book_list %}
<ul>
{% for book in book_list %}
<li><a href="{% url 'quotes:detail' book.id %}">{{ book.title }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No books are available.<p>
{% endif %}
<a href="{% url 'quotes:newQuote' %}"><button class="btn btn-primary">Create a New Quote</button></a>
<a href="{% url 'quotes:newBook' %}"><button class="btn btn-primary">Create a New Book</button></a>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
报价/ urls.py
from django.conf.urls import patterns, url
from django.contrib.auth.decorators import login_required
from quotes import views
urlpatterns = patterns('',
#no extra route sp (quotes/)
url(r'^$', views.IndexView.as_view(), name='index'),
#looks for id value next to /quotes/ and activates the detail view
#this regex capture the id value in <pk> probably lt and mt characters define this
#all these are 'quotes/andthensomething/'
url(r'^book/(?P<pk>\d+)/$', views.DetailView.as_view(), name='detail'),
url(r'^quote/(?P<pk>\d+)/$', views.QuoteDetailView.as_view(), name='quoteDetail'),
url(r'^quote/(?P<quoteID>\d+)/edit/$', views.QuoteEditView2 , name='editQuote'),
url(r'^quotes/', views.ListQuotesView.as_view(), name='listQuotes'),
url(r'^newQuote/', views.newQuote, name='newQuote'),
url(r'^newBook/', views.newBook, name='newBook'),
url(r'^createQuote/', views.createQuote, name='createQuote'),
url(r'^createBook/', views.createBook, name='createBook'),
url(r'^book/(?P<bookID>\d+)/delete/$', views.deleteBook, name='deleteBook'),
url(r'^quote/(?P<quoteID>\d+)/delete/$', views.deleteQuote, name='deleteQuote'),
url(r'^book/(?P<pk>\d+)/edit/$', views.BookEditView.as_view(), name='editBook'),
url(r'^quote/(?P<quoteID>\d+)/update/$', views.updateQuote, name='updateQuote'),
url(r'^book/(?P<bookID>\d+)/update/$', views.updateBook, name='updateBook'),
url(r'^logout/', views.logout_view, name="logout"),
#url(r'^accounts/login/', views.loginProper, name='loginProper'),
)
Run Code Online (Sandbox Code Playgroud)
调度的正确方法调用是:
def dispatch(self, request, *args, **kwargs):
Run Code Online (Sandbox Code Playgroud)
所以你应该:
def dispatch(self, request, *args, **kwargs):
return super(IndexView, self).dispatch(request, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)