Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有Django视图和foreignkey的基本逻辑_Django_Foreign Keys - Fatal编程技术网

带有Django视图和foreignkey的基本逻辑

带有Django视图和foreignkey的基本逻辑,django,foreign-keys,Django,Foreign Keys,我是Django的新手,正在努力解决一个基本问题,但无法在网上找到解决方案 我有这些模型: class Suggestion(models.Model): author = models.ForeignKey('auth.User') title = models.CharField(max_length=200) description = models.TextField() created_date = models.DateTimeField(defaul

我是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)
我正在尝试创建一个视图,将
投票
添加到给定的
建议
,捕获投票的用户。我见过一些人似乎用一个窗体或一个常规函数来实现这一点,所以不确定这里的最佳实践是什么

编辑

这是我的尝试(不起作用)。感谢您的帮助/建议

#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>
#forms.py
类VoteForm(forms.ModelForm):
类元:
模型=投票
字段=()
#models.py
集体投票(models.Model):
建议=模型。外键(建议)
投票者=models.ForeignKey('auth.User'))
投票计数=models.BooleanField()
#views.py
def添加投票(请求,主键):
如果request.method==“POST”:
form=VoteForm(request.POST)
建议=获取对象或404(建议,主键=主键)
如果form.is_有效():
投票=表单.save(提交=False)
vote.voter=request.user
vote.vote\u count=真
投票。保存()
返回呈现(请求'suggestion/suggestion_detail.html',{'suggestion':suggestion})
#投票表格.html
{%csrf_令牌%}
{{form}}
投票

您应该为投票创建一个表单,并将其包含在建议视图中。表单可以有自己的html——vote_form.html。然后将其包含在建议html页面上

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

至于投票计数,它不应该是整数字段,除非您希望用户投多张票。如果您只希望某人能够对每个建议进行一次投票,则应将投票计数设置为布尔字段(true或false)。然后,您可以将true指定给投票,将false指定给非投票。

我已经通过这种方式实现了我的愿望:

    #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,)))
#vote_form.html
{%csrf_令牌%}
#url.py
URL模式=[
url(r“^suggestion/(?P\d+)/$”,views.SuggestionDetail.as\u view(),name=“suggestion\u detail”),
url(r'^suggestion/(?P\d+)/vote/$,views.add_vote,name='add_vote'),
]  
#models.py
集体投票(models.Model):
建议=模型。外键(建议)
投票者=models.ForeignKey('auth.User'))
投票计数=models.BooleanField()
#views.py
def添加投票(请求,主键):
建议=获取对象或404(建议,主键=主键)
投票(
建议,
投票者=request.user,
投票(计数=真)
has\u user\u Vote=Vote.objects.filter(voter=request.user,suggestion=suggestion.count())
如果用户投票数小于1:
投票。保存()
其他:
messages.error(请求“您似乎已经投票,只允许一票”)
返回HttpResponseRedirect(反向('suggestion_detail',args=(suggestion.id,))

这太宽了。您需要显示您尝试过的代码,并说明您遇到的问题。
投票计数
字段的作用是什么。一个用户可以多次投票支持同一个建议吗?我已经用更多的细节更新了我的代码