我是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)
我正在尝试创建一个将Vote
添加到给定Suggestion
的视图,从而捕获投票的用户。我已经看到有些人似乎是通过表格或常规功能来完成的,所以不确定这里的最佳做法是什么?
编辑
这是我的尝试(不起作用)。任何帮助/建议都赞赏。
#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>
您应该为投票创建表单,并将其包含在建议视图中。表格可以具有自己的html -vote_form.html。然后将其包含在
的建议HTML页面上{% include '[name of directory]/vote_form.html' %}
至于投票数,除非您希望用户投票多票,否则它不应是整数字段。如果您只希望某人能够每个建议投票一次,则应该使投票_COUNT为布尔字段(是还是错误)。然后,您可以将真实的投票分配给非投票。
我设法以这种方式做了我想要的事情:
#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,)))