Django我想把用户投票限制在每24小时一次,但我把它限制在每篇文章,而不是每个用户



我想请你帮忙。我想创建一个简单的问题投票系统。我成功了,然后我想限制用户每24小时只能投票一次,结果我失败了。

我知道我想实现什么,但我不知道如何编码。

现在,由于我的错误,我限制了每24小时对QUESTION的投票一次。相反,我想限制一个用户每24小时对每个问题投票一次。所以我犯了一个非常愚蠢的错误。这是我的错误代码:

models.py:

class Question(models.Model):
question = models.CharField(max_length=300)
answered = models.BooleanField(default=False)
created = models.DateTimeField(auto_now_add=True)
datecompleted = models.DateTimeField(null=True, blank=True)
user = models.ForeignKey(User, on_delete=models.CASCADE)
votesscore = models.IntegerField(default='0')
votescoresubmitted = models.DateTimeField(null=True, blank=True)
amountofvotes = models.IntegerField(default='0')
def __str__(self):
return self.question

views.py:

@login_required()
def questionvoteup(request, question_pk):
question = get_object_or_404(Question, pk=question_pk, user=request.user)
if request.is_ajax() and request.method == "POST":
if question.votescoresubmitted is None or timezone.now() > question.votescoresubmitted + timedelta(minutes=1440):
question.votesscore += 1
question.amountofvotes += 1
question.votescoresubmitted = timezone.now()
question.save()
data = {
"msg": 'Thank you for your vote!'
}
return JsonResponse(data)
else:
raise forms.ValidationError("You can vote only one time every 24 hours.")
else:
return HttpResponse(400, 'Invalid form')

现在我看得很清楚。我认为我需要将这个"votescoresubmited"添加到User类中,并使它在某种程度上对每个问题都是唯一的。但我想不出该如何处理这个问题。我将非常感谢你的帮助。

谢谢。


编辑:

我与之斗争,我提出了额外的模型,应该存储有关投票的信息。现在我的代码如下所示:models.py:

from django.db import models
from django.contrib.auth.models import User

class Question(models.Model):
question = models.CharField(max_length=300)
answered = models.BooleanField(default=False)
created = models.DateTimeField(auto_now_add=True)
datecompleted = models.DateTimeField(null=True, blank=True)
user = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.question

class Answer(models.Model):
question_id = models.ForeignKey(Question, on_delete=models.CASCADE, blank=False, null=True)
answer = models.TextField(max_length=1000)
created = models.DateTimeField(auto_now_add=True)
user = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.answer

class VoteQuestion(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
question_id = models.ForeignKey(Question, on_delete=models.CASCADE, blank=False, null=True)
votesubmitted = models.DateTimeField(null=True, blank=True)
votesscore = models.IntegerField(default='0')
amountofvotes = models.IntegerField(default='0')

views.py:

@login_required()
def questionvoteup(request, question_pk):
votequestion = get_object_or_404(VoteQuestion, pk=question_pk, user=request.user)
current_time = timezone.now()
if request.is_ajax() and request.method == "POST":
if not votequestion.votesubmitted or current_time > votequestion.votesubmitted + timedelta(days=1):
votequestion.votesscore += 1
votequestion.amountofvotes += 1
votequestion.votesubmitted = current_time
votequestion.save()
msg = "Thank you for your vote!"
else:
msg = "You can vote only one time every 24 hours."
data = {"msg": msg}
return JsonResponse(data)
else:
return HttpResponse(400, 'Invalid form')

和home.html(在这里我触发投票UP(:

<ul>
{% for question in allquestionswithanswers %}
<li>
{{ question }} Score: {{ VoteQuestion.votesscore }} {{ question.user }}
<br><br>
<form class='my-ajax-form' method='POST' action='' data-url="{% url 'questionvoteup' question.id %}" >
{% csrf_token %}
<button type='submit'>UP</button>
</form>

{% for answer in question.answer_set.all %}
{{ answer }}<br>
{% endfor %}
</li>
{% endfor %}
</ul>

然而,在我点击"向上"后,我得到了错误:

Page not found at /viewquestion/6/voteup
No VoteQuestion matches the given query.

有几种方法可以做到这一点:

  • 将投票记录为与用户和问题相关的独立对象
  • 将用户的投票历史记录作为该用户对象的一部分进行记录

您要做的第一件事是创建一个具有相关字段user和question(多对一关系ForeignKey(的投票对象。这种方式几乎总是更容易做到。

第二种方法是,在用户模型中添加一个自定义字段来跟踪该用户的投票历史。请参阅扩展Django的默认用户



也许,在您看来,代替ValidationError,还可以给出一个信息:
@login_required
def questionvoteup(request, question_pk):
if request.is_ajax() and request.method == "POST":
current_time = timezone.now()
votequestion, created = VoteQuestion.objects.get_or_create(question_id=question_pk, user=request.user)
if not votequestion.votescoresubmitted or current_time > votequestion.votescoresubmitted + timedelta(days=1):
votequestion.votesscore += 1
votequestion.amountofvotes += 1
votequestion.votescoresubmitted = current_time
votequestion.save()
msg = "Thank you for your vote!"
else:
msg = "You can vote only one time every 24 hours."
data = {
"msg": msg
}
return JsonResponse(data)
else:
return HttpResponse(400, 'Invalid form')

以及您的VoteQuestion型号:

class VoteQuestion(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
question = models.ForeignKey(Question, on_delete=models.CASCADE)
votesubmitted = models.DateTimeField(null=True, blank=True)
votesscore = models.IntegerField(default=0)
amountofvotes = models.IntegerField(default=0)
class Meta:
unique_together = ['user', 'question']

最新更新