Django dispatch()在Django中得到了一个意外的关键字参数

lor*_*ess 2 django

我已经覆盖了我的视图类上的调度方法,因此它们需要用户登录.

例:

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)

pet*_*tas 5

调度的正确方法调用是:

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)