Django视图和外键的基本逻辑 [英] Basic logics with Django views and foreignkey

查看:124
本文介绍了Django视图和外键的基本逻辑的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是Django的新手,正在解决一个基本问题,但无法在线找到解决方案.

I am new to Django and struggling with a basic problem, yet cannot find a solution online.

我有以下模型:

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中,以捕获投票的用户.我看过有些人似乎是使用表单或常规函数来执行此操作的,所以不确定此处的最佳做法是什么?

and I'm trying create a view that would add a Vote to a given Suggestion, capturing the User who voted. I've seen some seem to do this with a form or with a regular function, so not sure what's the best practice here?

编辑

这是我的尝试(无效).任何帮助/建议表示赞赏.

Here is my attempt (not working). Any help/advice appreciated.

#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>

推荐答案

我已经设法通过这种方式完成了自己想做的事情:

I've managed to do what I wanted in this way:

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

这篇关于Django视图和外键的基本逻辑的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆