2017-09-13 2 views
1

저는 장고를 처음 사용하여 기본적인 문제로 어려움을 겪었지만 온라인에서 해결책을 찾을 수 없습니다.장고보기 및 외래 키가있는 기본 논리

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를 추가 뷰를 만들려고 해요 :

나는이 모델이있다. 나는 폼이나 정규 함수로 이것을하는 것으로 보이는 것을 보았으므로 여기서 가장 좋은 방법이 무엇인지 모르십니까?

편집은 여기 (작동하지 않는) 내 시도이다. 도움이나 조언을 부탁드립니다.

#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' 필드는 무엇입니까? 한 사용자가 동일한 제안에 여러 번 투표 할 수 있습니까? – 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를 부울 필드 (true 또는 false)로 설정해야합니다. 그렇다면 투표에 참을, 비 투표에 거짓을 할당 할 수 있습니다.