2017-09-19 3 views
1

this question以下のコードを思いついた。Djangoで1人のビュー生成を許可する

次のように動作は次のようになります。

  1. Suggestion

許可されているのみ1 Voteユーザーあたりのそれは正常に動作しますが、私は最善の方法だと思いまし

  • Voteいくつかを受け取ることができますこれをする?

    vote_form.html

    <form action="{% url 'add_vote' suggestion.id %}" method="post"> 
        {% csrf_token %} 
        <input type="submit" value="I want to vote"> 
    </form> 
    

    urls.py

    urlpatterns = [ 
        url(r'^suggestion/(?P<pk>\d+)/$', views.SuggestionDetail.as_view(), name="suggestion_detail"), 
        url(r'^suggestion/(?P<pk>\d+)/vote/$', views.add_vote, name='add_vote'), 
    ] 
    

    models.py

    class Vote(models.Model): 
        suggestion = models.ForeignKey(Suggestion) 
        voter = models.ForeignKey('auth.User') 
        vote_count = models.BooleanField() 
    

    views.py

    def add_vote(request, pk): 
        suggestion = get_object_or_404(Suggestion, pk=pk) 
        vote = Vote(
         suggestion = suggestion, 
         voter = request.user, 
         vote_count = True) 
        has_user_voted = Vote.objects.filter(voter=request.user, suggestion=suggestion).count() 
        if has_user_voted < 1: 
         vote.save() 
        else: 
         messages.error(request, 'It seems you have already voted, only one vote is allowed') 
        return HttpResponseRedirect(reverse('suggestion_detail', args=(suggestion.id,))) 
    
    +0

    することができます 'vote_count'持っ' false'の値を使用することができます

    class Vote(models.Model): suggestion = models.ForeignKey(Suggestion) voter = models.ForeignKey('auth.User') vote_count = models.BooleanField() class Meta: unique_together = ("suggestion", "voter") 

    常にvote_countあれば、あなたのモデルにunique-togetherを追加するのですか? –

    +0

    作成したときにTrueの値を得ることはできません – robtus88

    答えて

    2

    最初のソリューションは、あなたのデータにTrueあなたもget-or-create

    def add_vote(request, pk): 
        suggestion = get_object_or_404(Suggestion, pk=pk) 
        vote, created = Vote.objects.get_or_create(
          voter=request.user, 
          suggestion=suggestion, 
          vote_count=True) 
        if not created: 
         messages.error(request, 'It seems you have already voted, only one vote is allowed') 
        return HttpResponseRedirect(reverse('suggestion_detail', args=(suggestion.id,))) 
    
    +0

    ありがとう、テンプレートのエラーをレンダリングする方法がわかりません。私は今取得: IntegrityErrorがで/提案/ 7 /投票/ UNIQUE制約が失敗しました:suggestion_vote.suggestion_id、 リクエストメソッドをsuggestion_vote.voter_id:\t POST リクエストURL:\t http://127.0.0.1:8000/suggestion/ 7 /投票/ Djangoのバージョン:\t 1.11.4 例外タイプ:\t IntegrityError 例外値:\t UNIQUE制約が失敗しました:suggestion_vote.suggestion_id、suggestion_vote.voter_id – robtus88

    関連する問題