2017-09-13 21 views
1

私はDjangoの初心者ですが、基本的な問題に苦しんでいますが、解決策をオンラインで見つけることはできません。Djangoのビューと外部キーを使用した基本的なロジック

class Suggestion(models.Model): 
    author = models.ForeignKey('auth.User') 
    title = models.CharField(max_length=200) 
    description = models.TextField() 
    created_date = models.DateTimeField(default=timezone.now) 

    def __str__(self): 
     return self.title 


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

と私が投票し、ユーザーを取り込み、与えられたSuggestionVoteを追加するビューを作成しようとしている:

は、私はこれらのモデルを持っています。私はいくつかのフォームや定期的な関数でこれを行うように見えるので、ここで何がベストプラクティスであるか分からない?

EDITは、ここで(動作しない)私の試みです。任意のヘルプ/アドバイスをいただければ幸いです

#forms.py 
class VoteForm(forms.ModelForm): 

    class Meta: 
     model = Vote 
     fields =() 

#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): 
    if request.method == 'POST': 
     form = VoteForm(request.POST) 
     suggestion = get_object_or_404(Suggestion, pk=pk) 
     if form.is_valid(): 
      vote = form.save(commit=False) 
      vote.voter = request.user 
      vote.vote_count = True 
      vote.save() 
      return render(request, 'suggestion/suggestion_detail.html', {'suggestion': suggestion}) 

#vote_form.html 
<form method="post"> 
    {% csrf_token %} 
    {{ form }} 
    <button type="submit">Vote</button> 
</form> 
+0

これは広すぎます。あなたが試したコードを表示し、それに伴う問題について言及する必要があります。 –

+0

のための 'vote_count'フィールドとは何ですか? 1人のユーザーが同じ提案に対して複数回投票できますか? – schwobaseggl

+0

私のコードをより詳細に更新しました – robtus88

答えて

1

私は、このようにしたかった何をするために管理してきました:

#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,))) 
1

投票用のフォームを作成し、それを[提案]ビューに含める必要があります。フォームはそれ自身のHTMLを持つことができます - vote_form.html。そして、投票数については

{% include '[name of directory]/vote_form.html' %} 

で提案htmlページ上でそれを含めるユーザーが複数票を投じるする場合を除き、それは整数フィールドではありません。誰かが提案ごとに一度投票できるようにするには、vote_countをbooleanフィールド(trueまたはfalse)にする必要があります。投票に真を、非投票に偽を割り当てることができます。

関連する問題