如何在基于 Django Class 的创建视图中限制每个用户每 24 小时只允许 post 一次
How to limit each user to only allowed to post once every 24 hours in Django Class Based Create View
在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
如果这是一个基于函数的视图,我想解决方案将类似于...
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 class 的视图中执行 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%}
在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
如果这是一个基于函数的视图,我想解决方案将类似于...
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 class 的视图中执行 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%}