Kwargs e visualizações baseadas em classe em Django
-
24-09-2019 - |
Pergunta
Eu procurei assim e o Doc Doc e não consigo encontrar isso. Estou estendendo a funcionalidade base do django.contrib.commentos App para usar o sistema de permissão personalizado que está no meu webApp. Para as ações de moderação, estou tentando usar uma visualização baseada em classe para lidar com a consulta básica do comentário e permissão verificando. ("Ecomment" neste contexto é o meu "comentário aprimorado", herdado do modelo de comentário da base django.)
O problema que estou tendo é comment_id
é um kwarg que está sendo passado do URL no urls.py. Como faço para recuperar isso corretamente de uma visão baseada em classe?
No momento, Django está jogando o erro TypeError: ModRestore() takes exactly 1 argument (0 given)
. Código incluído abaixo.
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()
Solução
Você não está usando uma visualização baseada em classe. Você escreveu acidentalmente def
ao invés de class
:
def ECommentModerationApiView(object):
...
def ModRestore(ECommentModerationApiView):
provavelmente deveria ser:
class ECommentModerationApiView(object):
...
class ModRestore(ECommentModerationApiView):
Outras dicas
Além disso, seu padrão de URL precisa parecer:
url(r'restore/(?P<comment_id>.+)/$', ModRestore.as_view(), name='ecomments_restore'),