【问题标题】:Simple Django Form POST - Not posting简单的 Django 表单 POST - 不发布
【发布时间】:2014-01-24 14:23:07
【问题描述】:

我对 Django 和一般的编程相当陌生,每次有人单击模板中的按钮时,我都会尝试将 IntegerField 递增一。我已经研究了大约 10 个小时(我知道,荒谬),但没有运气......我认为这只是我刚刚看过的非常简单的事情。我以为我已经用thisthis 问题解决了它,但我仍然无法得到它。

这是我的模板(我用它来 {% include %} 在单独的模板中):

{% block body %}
<form method="post" action="/vote/">{% csrf_token %}
    <input type="submit" name="endorsers" value="Endorse" />
</form>
{% endblock %}

模型.py:

class IdeaID(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=30)
    description = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published', auto_now_add=True)
    endorsers = models.IntegerField(default=0)
    contributors = models.IntegerField(default=0)
    backers = models.IntegerField(default=0)

    def __unicode__(self):
        return self.name

我的网址是这样设置的:

url(r'^vote/$', 'ideaMachine.views.vote'),

和 Views.py:

@login_required
def vote(request):
    if (request.method == 'POST') and ("endorsers" in request.POST):
        idea_list = request.POST.getlist('ideaid')

        for idea in idea_list:
            ideaVote = IdeaID.objects.get(pk=idea)
            ideaVote.endorsers += 1
            ideaVote.save()
    return render_to_response(
        'vote_success.html', RequestContext(request)
    )

从 django 的开发服务器,我得到一个“'POST /vote/ HTTP/1.1' 200 58”。我不确定这是否有助于解决我的问题。这篇文章实际上并没有像我想要的那样更新我的背书者字段,而是 成功地将我发送到了 vote_success.html。我在这一点上迷路了,任何帮助将不胜感激。提前谢谢!

【问题讨论】:

  • 你发过ideaid吗?从外观上看,您提交的是一个空表单,因此idea_list 永远不会得到任何东西(这一行:idea_list = request.POST.getlist('ideaid')
  • 是的,我的问题和 Jeff 一样...您是否发布了“ideaid”的任何值?
  • 非常奇怪的描述。由于您的 django 服务器正在显示 POST 请求,因此该表单已明确发布。如果您没有看到数据库中的任何更改,那么 1) 检查您是否甚至超出了条件。您可以通过在此处引发错误来做到这一点,或者如果您有更多时间 - 添加日志记录并将某些内容记录到那里的文件中。 2)就像杰夫说的,看看idea_list是否包含一些东西。
  • 哇你们真快!抱歉,如果我含糊不清,这是我的第一篇 stackoverflow 帖子。你们都是对的,表格实际上并没有做任何事情。感谢您的帮助

标签: django python-2.7 django-views


【解决方案1】:

您可能正在尝试实现允许不同用户背书的功能。

您可以通过以下方式修改代码以使其工作:

在vote.html模板中修改为:

<form method="post" action="/vote/">{% csrf_token %}
{% for ideaid in ideaids %}
    <li>{{ ideaid.user }} - {{ ideaid.endorsers }}
    <input type="checkbox" name="ideaid" value="{{ ideaid.id }}" /></li><br />
{% endfor %}
<input type="submit" name="endorsers" value="Endorse" />
</form>

我假设 vote_success.html 看起来像

{% for ideaid in ideaids %}
    <li>{{ ideaid.user }} - {{ ideaid.endorsers }}
{% endfor %}

然后你可以修改views.py

  • 使用render(request,而不是render_to_response
  • 在上下文中使用 IdeaID 中的数据填充ideaid
  • 在成功处理 POST 数据后总是返回一个 HttpResponseRedirect。如果用户点击“后退”按钮,这可以防止数据被发布两次。

views.py

from django.http import HttpResponse, HttpResponseRedirect
from django.template import Context, RequestContext, loader
from django.core.urlresolvers import reverse
from django.shortcuts import render, render_to_response

def vote(request):

    if (request.method == 'POST') and ("endorsers" in request.POST):
        idea_list = request.POST.getlist('ideaid')

        for idea in idea_list:
            ideaVote = IdeaID.objects.get(pk=idea)
            ideaVote.endorsers += 1
            ideaVote.save()
        return HttpResponseRedirect(reverse('ideaMachine.views.vote_success', args=()))

    ideaid = IdeaID.objects.all()
    return render(request, 'vote.html', {'ideaids':ideaid})

def vote_success(request):
    ideaid = IdeaID.objects.all()
    return render(request, 'vote_success.html', {'ideaids':ideaid})

您还需要在 urls 中添加一个条目:

    url(r'^success/$', 'ideaMachine.views.vote_success'),

【讨论】:

  • 谢谢,成功了!我相信我的主要问题在于形式。非常有用的帖子,谢谢。我仍在努力掌握所有这些:/
猜你喜欢
  • 1970-01-01
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-10
  • 2019-01-16
  • 1970-01-01
  • 2018-03-06
相关资源
最近更新 更多