2017-02-11 5 views
-1

Verwenden Sie Listview anstelle von list_detail in django und ist fehlgeschlagen.Django Listview.as_view() benötigt 1 Positionsargument, aber 2 wurden angegeben

Wie behebt man das?

Ich möchte alle Bücher wo Herausgeber == Name (Name von URL) erhalten.

Typeerror bei/app_generic_view/Bücher/test/

as_view() nimmt ein Positions Argument aber 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') 
gegeben wurden

Antwort

1

Ihre Funktion books_by_publisher() nimmt eine Anfrage als Argument entgegen. Ich nehme an, das ist eine Ansicht. Es sollte eine HttpResponse-Instanz oder eine der abgeleiteten Klassen zurückgeben.

Stattdessen geben Sie ListView.as_view() zurück. ListView.as_view() ist eine Methode, die eine Ansicht (eine Python-Funktion) zurückgibt. as_view() kann keine Anfrage als Argument annehmen und gibt keine HTTP-Antwort zurück.

Der richtige Weg zur Verwendung der Django-Klassen-basierten Ansicht besteht darin, eine der vordefinierten Klassen abzuleiten und as_view() in Ihrem URL-Muster zu verwenden, um die entsprechende Ansichtsfunktion zu erhalten.

Beispiel:

# 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'), 
] 
+0

Sie müssen 'get_queryset' außer Kraft setzen und den Herausgebernamen filtern. – Alasdair

0

von einem anderen Blick zu nennen, die Sie verwenden sollten:

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

Die 'queryset' und' template_name' Argumente noch 'as_view' geben werden sollen:' Rückkehr ListView.as_view (queryset = Book.objects.filter (publisher = Verlag), template_name = 'publisher_list_page.html') (Anfrage) '. Die Unterklassenlistenansicht wie in @ Antwanes Antwort wäre jedoch ein besserer Ansatz. – Alasdair

Verwandte Themen