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

Popular posts from this blog

ios - iPhone/iPad different view orientations in different views , and apple approval process -

java Extracting Zip file -

C# WinForm - loading screen -