Kwargs et des vues basées sur les classes de Django
-
24-09-2019 - |
Question
Je l'ai cherché et semblent si le doc Django et ne peut pas être en mesure de trouver cela. Je l'extension de la fonctionnalité de base du django.contrib.comments application pour utiliser le système d'autorisation personnalisé qui est dans mon webapp. Pour les actions de modération, je tente d'utiliser une vue basée sur la classe pour gérer la base de requêtes le commentaire et l'autorisation de vérifier sur elle. ( "EComment" dans ce contexte est mon "commentaire amélioré", héritée de la base django modèle Commentaire.)
Le problème que je vais avoir est comment_id
est un kwarg être passé depuis l'URL dans le urls.py. Comment puis-je récupérer ce bien d'une vue basée sur la classe?
En ce moment, Django est de lancer la TypeError: ModRestore() takes exactly 1 argument (0 given)
d'erreur. Code inclus ci-dessous.
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()
La solution
Vous n'utilisez pas une vue basée sur la classe. Vous avez écrit accidentellement def
au lieu de class
:
def ECommentModerationApiView(object):
...
def ModRestore(ECommentModerationApiView):
devrait probablement être:
class ECommentModerationApiView(object):
...
class ModRestore(ECommentModerationApiView):
Autres conseils
aussi, votre modèle d'URL doit ressembler à:
url(r'restore/(?P<comment_id>.+)/$', ModRestore.as_view(), name='ecomments_restore'),