Django Listview.as_view()接受1个位置参数,但有2个被赋予

时间:2017-02-11 16:17:25

标签: python django

在django中使用Listview而不是list_detail并失败。

如何解决这个问题?

我希望获得所有图书,其中publisher == name(来自网址的名称)。

/ app_generic_view / books / test /

中的TypeError

as_view()需要1个位置参数,但有2个被给出

def books_by_publisher(request, name):
    publisher = get_object_or_404(Publisher, name=name)
    return ListView.as_view(request, queryset=Book.objects.filter(publisher=publisher),
        template_name='publisher_list_page.html')

2 个答案:

答案 0 :(得分:2)

您的函数books_by_publisher()接受请求作为参数。所以我认为这是一个观点。它应该返回一个HttpResponse实例或一个派生类。

而是返回ListView.as_view()。 ListView.as_view()是一个返回视图的方法(python函数)。 as_view()不能将请求作为参数,也不会返回HTTP响应。

使用基于Django类的视图的正确方法是将一个预定义的类子类化,并在urlpatterns中使用as_view()来获取相应的视图函数。

示例:

# models.py
class MyCustomView(ListView):
    model = Publisher
    template_name = publisher_list_page.html

# urls.py
urlpatterns = [
    url(r'^a_pattern/(?P<name>[a-z]+)', MyCustomView.as_view(), name='a_name'),
]

答案 1 :(得分:0)

要从另一个视图中调用视图,您应该使用:

return ListView.as_view()(request, queryset=Book.objects.filter(publisher=publisher),
        template_name='publisher_list_page.html')