簡體   English   中英

Django 我想將用戶投票限制為每 24 小時一次,但我將其限制為每篇文章而不是每個用戶

[英]Django I want to limit user voting to once per 24 hours but I limited it per article and not per user

我想請你幫忙。 我想為問題創建簡單的投票系統。 我成功了,然后我想限制用戶每 24 小時只能投票一次,結果我慘遭失敗。

我知道我想要實現什么,但我不知道如何編碼。

現在,由於我的錯誤,我限制了每 24 小時一次對 QUESTION 的投票。 相反,我想限制一個用戶每 24 小時對每個問題投票一次。 所以我犯了一個非常愚蠢的錯誤。 這是我的錯誤代碼:

模型.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

視圖.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')

現在我可以清楚地看到它。 我認為我需要將這個“votescoresubmitted”添加到用戶 class,並使其對每個問題都具有某種獨特性。 但我想不出我應該如何處理這個問題。 我將非常感謝您的幫助。

謝謝你。


編輯:

我與之斗爭,我想出了額外的 model 應該存儲有關投票的信息。 現在我的代碼看起來像這樣: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')

視圖.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 (我觸發投票向上):

<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>

然而,在我點擊“UP”后,我得到了錯誤:

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

有幾種方法可以做到這一點:

  • 將投票記錄為與用戶和問題相關的獨立對象
  • 將用戶的投票歷史記錄作為該用戶的 object 的一部分

第一個,您要做的是創建一個投票 object 與相關字段用戶和問題(多對一關系ForeignKey )。 這種方式幾乎總是更容易做到。

第二種方式,將自定義字段添加到用戶 model 以跟蹤該用戶的投票歷史記錄。 請參閱擴展 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 model:

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']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM