0
我最近在我的Django应用程序中切换到基于类的视图,并希望尽可能优雅地使用它们。在应用程序中,我有一个评论系统,如果权限匹配,管理员应该能够删除和/或发布/取消发布评论。我写了一个RedirectView
,包括功能:在django的同一个基于类的视图中使用不同的权限装饰器
class CommentChangeView(RedirectView, SingleObjectMixin):
"""
A redirection that acts on a Comment. The url parameter
"action" is taken as a class function and executed.
"""
model = Comment
def get_redirect_url(self, pk):
"""
Redirect to the article page, always.
"""
return reverse('post', args=(self.object.post.slug,))
def get(self, *args, **kwargs):
"""
Here, it is decided what to execute.
"""
self.object = self.get_object()
func = getattr(self, kwargs.pop('action', None), None)
if callable(func):
func()
return super(CommentChangeView, self).get(*args, **kwargs)
@method_decorator(permission_required('blog.delete_comment'))
def delete(self):
"""
Delete the comment
"""
self.object.delete()
messages.success(self.request, 'Comment deleted.')
@method_decorator(permission_required('blog.change_comment'))
def toggle_publish(self):
"""
Toggle its publication state
"""
self.object.published = not self.object.published
self.object.save()
messages.success(self.request, 'Comment toggled.')
现在的问题是,我想这两个动作有不同的权限 - 因此不同的装饰。通常,dispatch
函数是装饰的。上面的代码不起作用,我得到TypeError
。没有装饰者,它完美的作品。
我该如何实施这种情况?还是应该分开删除和发布的意见?
这里是TypeError
的堆栈跟踪:
Internal Server Error: /comment/toggle_publish/1/
Traceback (most recent call last):
File "/***/lib/python2.7/site-packages/django/core/handlers/base.py", line 115, in get_response
response = callback(request, *callback_args, **callback_kwargs)
File "/***/lib/python2.7/site-packages/django/views/generic/base.py", line 68, in view
return self.dispatch(request, *args, **kwargs)
File "/***/lib/python2.7/site-packages/django/views/generic/base.py", line 86, in dispatch
return handler(request, *args, **kwargs)
File "/***/blog/blog/views.py", line 186, in get
func()
File "/***/lib/python2.7/site-packages/django/utils/decorators.py", line 25, in _wrapper
return bound_func(*args, **kwargs)
TypeError: _wrapped_view() takes at least 1 argument (0 given)
您应该发布'TypeError'的回溯。 *可能*有助于调试。 – 2013-04-05 22:04:44