如何在django中覆盖GET方法以使其处于可见状态

时间:2017-11-04 17:08:36

标签: django django-models django-views

我想在模型上做这件事,因为我也在使用REST API。

我有一个名为Seen

的模型
class Seen(models.Model):
    seen = models.BooleanField(
        verbose_name=_("Is active"), default=True,
        help_text=_("Inactive devices will not be sent notifications")
    )
    user = models.ForeignKey(
        SETTINGS["USER_MODEL"], blank=True, null=True, on_delete=models.CASCADE
    )
    post = models.ForeignKey(Posts)

我想重写我自定义的基于类的视图,以便每次经过身份验证的用户访问DetailView时,我都会创建Seen的实例。

1 个答案:

答案 0 :(得分:0)

在基于班级的视图中,您可以覆盖方法get

def get(self, request, *args, **kwargs):
    # fetch your values from request.GET.get('key')
    # and play around with it
    return self.render_to_response(context)

或者,因为您正在使用DetailView

def get_object(self, queryset=None):
    # key for Post's id (consider it as 'id'),  you maybe named it differently
    post_id = self.kwargs.get('id') 
    if post_id is None:
        raise Http404
    try:
        post = Post.objects.get(id=post_id) # fetch your post
        user = self.request.user # considering your user is authenticated
        # Create Seen object and save it with params,
        # seen field is optional, since you set defaul value
        seen_object = Seen.objects.create(post=post, user=user, seen=True)
    except Post.DoesNotExist: # if wrong id was passed
        raise Http404
    return post # return an object for your DetailView

P.S。:为了确保您的用户经过身份验证,请在您的视图中添加LoginRequiredMixin,例如:PostDetailView(LoginRequiredMixin, DetailView)并设置login_url='login'