Using different permission decorators in the same class based view in django -
i switched class-based views in django app , want use them elegantly possible. in app, have comment system and, if permissions matched, admins should able delete and/or publish/unpublish comment. wrote redirectview that, including both functionality:
class commentchangeview(redirectview, singleobjectmixin): """ redirection acts on comment. url parameter "action" taken class function , executed. """ model = comment def get_redirect_url(self, pk): """ redirect article page, always. """ return reverse('post', args=(self.object.post.slug,)) def get(self, *args, **kwargs): """ here, decided 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 comment """ self.object.delete() messages.success(self.request, 'comment deleted.') @method_decorator(permission_required('blog.change_comment')) def toggle_publish(self): """ toggle publication state """ self.object.published = not self.object.published self.object.save() messages.success(self.request, 'comment toggled.') now thing is, want 2 actions have different permissions - hence different decorators. usually, dispatch function decorated. code above doesn't work, getting typeerror. without decorators, works perfectly.
how implement case? or should separate views deletion , publication?
here stacktrace of 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 func() file "/***/lib/python2.7/site-packages/django/utils/decorators.py", line 25, in _wrapper return bound_func(*args, **kwargs) typeerror: _wrapped_view() takes @ least 1 argument (0 given)
bibhas pointed me right direction, more closely looking @ stacktrace. able working introducing 1 additional argument functions. code works now:
class commentchangeview(redirectview, singleobjectmixin): """ redirection acts on comment. url parameter "action" taken class function , executed. therefore combines delete , publish_comment functions (and, later, possibly) more. """ model = comment def get_redirect_url(self, pk): """ redirect article page, always. """ return reverse('post', args=(self.object.post.slug,)) def get(self, request, *args, **kwargs): """ here, decided execute. """ self.object = self.get_object() func = getattr(self, kwargs.pop('action', none), none) if callable(func): func(request) return super(commentchangeview, self).get(request, *args, **kwargs) @method_decorator(permission_required('blog.delete_comment')) def delete(self, request): """ delete comment """ self.object.delete() messages.success(self.request, 'comment deleted.') @method_decorator(permission_required('blog.change_comment')) def toggle_publish(self, request): """ toggle publication state """ self.object.published = not self.object.published self.object.save() messages.success(self.request, 'comment toggled.')
Comments
Post a Comment