Django - Как использовать определенные пользовательские разрешения в представлениях и шаблонах?
Для моего "учебного приложения" я создал определенные разрешения после создания объекта. Только автор объекта должен иметь возможность обновлять или удалять его.
Я новичок, и я здесь, чтобы учиться, если мои методы уродливы, будьте терпимы.
Здесь мои views.py
class CreateArticle(LoginRequiredMixin, generic.CreateView):
model = Article
context_object_name = 'article'
template_name = "blog/edit_article.html"
form_class = ArticleForm
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.slug = auto_slug(self.object.titre)
user = User.objects.get(id=self.request.user.id)
self.object.auteur = user
self.object.save()
"""On génère les 2 permissions suivantes :
Modifier l'article dont on est l'auteur
Supprimer l'article dont on est l'auteur"""
content_type = ContentType.objects.get(app_label='blog', model='article')
permission = Permission.objects.create(
codename='edit_article_{0}'.format(self.object.id),
name='Modifier l\'article {0}'.format(self.object.titre),
content_type=content_type
)
user.user_permissions.add(permission)
permission = Permission.objects.create(
codename='delete_article_{0}'.format(self.object.id),
name='Supprimer l\'article {0}'.format(self.object.titre),
content_type=content_type
)
user.user_permissions.add(permission)
messages.success(self.request, "L'article a été crée")
return HttpResponseRedirect(self.get_success_url())
Поэтому я хотел использовать эти разрешения в моих общих представлениях UpdateArticle и DeleteArticle. Проблема в том, что они специфичны, и я не знаю, как их использовать.
1 ответ
Вы можете создать собственный набор разрешений, чтобы гарантировать, что только автор может вносить изменения в существующую статью. Вот быстрый пример:
class SameUserOnlyMixin(object):
def has_permissions(self):
# Assumes that your Article model has a foreign key called `auteur`.
return self.get_object().auteur == self.request.user
def dispatch(self, request, *args, **kwargs):
if not self.has_permissions():
raise Http404('You do not have permission.')
return super(SameUserOnlyMixin, self).dispatch(
request, *args, **kwargs)
С этим миксином просто вставьте его перед любыми классами в представлениях, в которых вы хотите его использовать.
class CreateArticle(SameUserOnlyMixin, generic.CreateView):
...
Проверьте мой другой ответ для получения дополнительной информации.