Kwargs und klassenbasierte Ansichten in Django
-
24-09-2019 - |
Frage
Ich habe SO und die Django doc gesucht und scheinen nicht in der Lage zu sein, diese zu finden. Ich erweitere die Basisfunktionalität des django.contrib.comments App das benutzerdefinierte Berechtigungssystem, dass in meinem Webapp zu verwenden. Für die Moderation Aktionen, bin ich versucht, eine klassenbasierte Ansicht zu verwenden, um die grundlegende Abfrage des Kommentars und die Erlaubnis Prüfung auf sie zu handhaben. ( "EComment" in diesem Zusammenhang ist mein "enhanced Kommentar", von der Basis django Kommentar Modell geerbt.)
Das Problem, das ich habe, ist comment_id
ist ein kwarg in der urls.py. von der URL übergeben wird Wie rufe ich das richtig aus einer klassenbasierten Ansicht?
Im Moment wird Django den Fehler TypeError: ModRestore() takes exactly 1 argument (0 given)
werfen. Code unten enthalten.
urls.py
url(r'restore/(?P<comment_id>.+)/$', ModRestore(), name='ecomments_restore'),
views.py
def ECommentModerationApiView(object):
def comment_action(self, request, comment):
"""
Called when the comment is present and the user is allowed to moderate.
"""
raise NotImplementedError
def __call__(self, request, comment_id):
c = get_object_or_404(EComment, id=comment_id)
if c.can_moderate(request.user):
comment_action(request, c)
return HttpResponse()
else:
raise PermissionDenied
def ModRestore(ECommentModerationApiView):
def comment_action(self, request, comment):
comment.is_removed = False
comment.save()
Lösung
Sie verwenden keine klassenbasierten Ansicht. Sie schrieb versehentlich def
statt class
:
def ECommentModerationApiView(object):
...
def ModRestore(ECommentModerationApiView):
sollte wohl sein:
class ECommentModerationApiView(object):
...
class ModRestore(ECommentModerationApiView):
Andere Tipps
auch, Ihre URL-Muster Bedürfnisse wie folgt aussehen:
url(r'restore/(?P<comment_id>.+)/$', ModRestore.as_view(), name='ecomments_restore'),