Kwargs e punti di vista di classe a base di Django
-
24-09-2019 - |
Domanda
Ho cercato SO e il doc Django e non può sembrano essere in grado di trovare questo. Sto estendendo le funzionalità di base del django.contrib.comments app per utilizzare il sistema di autorizzazione personalizzato che è nella mia webapp. Per le azioni di moderazione, sto cercando di utilizzare una visualizzazione di classe-based per gestire l'interrogazione di base del controllo e l'autorizzazione commento su di esso. ( "EComment" in questo contesto è il mio "enhanced commento", ereditato dalla base Django modello di commento.)
Il problema che sto avendo è comment_id
è un kwarg viene passato nel dall'URL nel urls.py. Come faccio a recuperare correttamente questo da una visione classista?
In questo momento, Django sta gettando il TypeError: ModRestore() takes exactly 1 argument (0 given)
errore. Codice riportato qui di seguito.
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()
Soluzione
Non si utilizza una vista basata sulle classi. È accidentalmente scritto def
invece di class
:
def ECommentModerationApiView(object):
...
def ModRestore(ECommentModerationApiView):
dovrebbe probabilmente essere:
class ECommentModerationApiView(object):
...
class ModRestore(ECommentModerationApiView):
Altri suggerimenti
Inoltre, le vostre esigenze modello url per assomigliare a:
url(r'restore/(?P<comment_id>.+)/$', ModRestore.as_view(), name='ecomments_restore'),