Django / Python-帮助移动is_authenticated和用户== model.user进行查看

时间:2018-08-02 20:25:16

标签: python django django-templates

首先,很抱歉,如果我不清楚我要做什么或没有提供足够的信息,那么我对Django / Python还是比较陌生。

我目前有一个视图,该视图呈现类似博客文章的内容:

class SingleCharacter(LoginRequiredMixin,generic.DetailView):
    model = models.Character

    def get_context_data(self, **kwargs):
        context = super(SingleCharacter, self).get_context_data(**kwargs)
        return context

并且,在此视图的模板中,我有一个模板标记,用于检查用户是否已通过身份验证以及帖子的所有者:

 {% if user.is_authenticated and user == character.user %}

但是,我目前正在将xhtml2pdf合并到我的项目中,并且这种将帖子仅保护创建它的用户的方法引起了一些问题。

我想知道是否有可能将user.is_authenticated和user == character.user移入视图而不是模板标签,如果可以的话,我可以使用简单的if语句来执行此操作吗? / p>

class SingleCharacter(LoginRequiredMixin,generic.DetailView):
    model = models.Character
    if user.is_authenticated and user == character.user:
      def get_context_data(self, **kwargs):
          context = super(SingleCharacter, self).get_context_data(**kwargs)
          return context
    else:
      <I'll include some redirect to a 404 page>

我正在尝试是否还有另一种方法,但我想我会把这里扔给更有经验的人,希望能弄清楚。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

您可以覆盖DetailView的get方法并在那里处理逻辑:

class SingleCharacter(LoginRequiredMixin,generic.DetailView):
    model = models.Character

    def get(self, request, *args, **kwargs):
        self.object = self.get_object()
        if self.request.user.is_authenticated and self.request.user == self.object.user:
            context = self.get_context_data(object=self.object)
            return self.render_to_response(context)
        else:
            # redirect

答案 1 :(得分:0)

我认为您可以创建一个 CustomPermissionMixin 并使用它代替 LoginRequiredMixin 作为

from django.shortcuts import get_object_or_404


class MyCustomPermissionMixin(LoginRequiredMixin):
    def dispatch(self, request, *args, **kwargs):
        if not request.user.is_authenticated and request.user != get_object_or_404(models.Character, kwargs['pk']).user:
            return self.handle_no_permission()
        return super(LoginRequiredMixin, self).dispatch(request, *args, **kwargs)


class SingleCharacter(MyCustomPermissionMixin, generic.DetailView):
    model = models.Character

    def get_context_data(self, **kwargs):
        context = super(SingleCharacter, self).get_context_data(**kwargs)
        return context