python - 如何在 Django 基于类的创建 View 中限制每个用户仅允许每 24 小时发帖一次

标签 python django django-models django-views django-class-based-views

在views.py中:

class AddPostView(LoginRequiredMixin, CreateView):
    login_url = '/member/login'
    model=Post
    form_class = PostForm
    template_name='post/addpost.html'
    def form_valid(self, form):
        form.instance.poster = self.request.user
        return super(AddPostView, self).form_valid(form)

在 forms.py 中

class PostForm(forms.ModelForm):
  class Meta:
      model = Post
      fields = ('title','somefields...')
      labels = {'somelabels': '...'}
      widgets = {'some css attributes....'}
      def has_posted_today(self):
          yesterday = timezone.now() - timezone.timedelta(hours=24)
          poster = self.cleaned_data.get('poster')
          if Post.objects.filter(poster=poster, post_date__gt=yesterday).exists():
              raise forms.ValidationError("You have already posted today, Come back tomorrow!")

在 models.py 中

class Post(models.Model):
    title = models.CharField(max_length=100)
    poster = models.ForeignKey(User, on_delete=models.CASCADE)
    post_date = models.DateTimeField(default=timezone.now, blank=True)
    ...somefields = ...somemodels

如果这是一个基于函数的 View ,我想解决方案会是这样的......

if request.method == "POST":
    yesterday = timezone.now() - timezone.timedelta(days=1)
    if Post.objects.filter(poster=request.user, post_date__gt=yesterday).exists():
        return HttpResponseForbidden("You have already posted today, Come back tomorrow!")

第一个问题,我的代码不起作用......我该如何让它工作......

第二个问题,如何在基于 django 类的 View 中执行 HttpResponseForbidden 操作。

最佳答案

在views.py中:

class AddPostView(UserPassesTestMixin, LoginRequiredMixin, CreateView):
    login_url = '/member/login'
    model=Post
    form_class = PostForm
    template_name='post/addpost.html'
    def test_func(self):
        yesterday = datetime.now() - timedelta(day=1)
        #print to see which time is correct.
        print('this is yesterday...', yesterday)
        print('this is timezone.now()...', timezone.now())
        print('this is daytime.now()...', datetime.now())
        if Post.objects.filter(poster=self.request.user, post_date__gt=yesterday).exists():
            raise PermissionDenied("You have made your post today, Please come back later")
            return False
        else:
            return True
    def form_valid(self, form):
        form.instance.poster = self.request.user
        return super(AddPostView, self).form_valid(form)

在 403.html 中:

{%extends 'base.html'%}
{%block content%}
    {%if exception%}
        <h1>{{exception}}</h1>
    {%else%}
        <h1>Somethings Wrong!</h1>
    {%endif%}
{%endblock%}

关于python - 如何在 Django 基于类的创建 View 中限制每个用户仅允许每 24 小时发帖一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67168848/

相关文章:

python - 如何查询和比较对象上 JSONbField 的值?

python - 如何使用python类型提示动态地将父方法的返回类型指定为子类?

python - sqlalchemy 查找表

python - appengine 的 OAuth2 身份验证停止工作

python - Django admin inline 有 2 个指向同一模型的外键

python - Django 使用工厂函数从同一基类创建多个表/模型类

Django 模型管理器.py 和模型.py

python - 如何在 python 脚本中运行终端命令?

python - django 多个数组转json错误

django - 使用 Factory Boy 伪造 JSONField