【问题标题】:Simple vote button in DjangoDjango中的简单投票按钮
【发布时间】:2012-10-05 12:46:00
【问题描述】:

我是 django(和一般编程)的绝对初学者,我已经尝试了 django Polls 教程并且一切顺利,但是我试图让一个最小的投票按钮工作。基本上我已经建立了一个包含两列的数据库,我的models.py 看起来像这样

from django.db import models


class Imgurl(models.Model):

    urlvar = models.URLField(max_length=200)# a URL linking to an image
    urlvote = models.IntegerField(default=0)# my intended vote count

    def __unicode__(self):
        return self.urlvar

我已经创建了一个输入框,我可以在其中复制和粘贴图片网址,然后此图片会显示在单独的页面上(效果很好)。我想要的是在每个显示的图像旁边都有一个投票按钮,用户可以在其中单击按钮(我正在尝试使用提交按钮),并且数据库中的投票数将增加(不会重定向到新页面,或任何花哨的东西)。

我认为这是一个微不足道的问题,我正在尝试学习 POST 的基础知识和 django 中的数据库处理(另外,我已经阅读了 djangobook 中的相关章节......也许我有点慢?)

我的观点是这样的

def urlvotes(request):

    if request.method=='POST':
        if 'voteup' in request.POST:
            v=Imgurl(forloop.counter)
            v.urlvote +=1
        else:
            pass
        votetotal=v.urlvote # attempt to give the template some kind of context
    return render_to_response('display.html', {'votetotal':votetotal}, context_instance=RequestContext(request))

我的模板如下所示:

{% extends "base.html" %}

{% block head %}Image display{% endblock %}
{% block content1 %}

<a href="http://127.0.0.1:8000/home/">Home</a>
{% if links %}
        <ul>
        {% for link in links %}
            <li><img src="{{ link }}"></li>

            <li><form action="{% url urlvotes %}" method="post"> 
            {% csrf_token %}
            <input type="submit" name="voteup" value='vote'/></p>
            <p>{{votetotal}}</p>
            </form></li>

        {% endfor %}

        </ul>
{% else %}
<p>No uploads.</p>
{% endif %}
{% endblock %}

当我按原样运行时,我收到一个 csrf 验证失败错误

任何帮助将不胜感激

【问题讨论】:

  • 这听起来很像这个问题:stackoverflow.com/questions/4547639/…
  • 谢谢我去看看
  • 挑剔:在&lt;a href="http://127.0.0.1:8000/home/"&gt;Home&lt;/a&gt; 中使用/home/ 没有完整的ip:port。 (如果你愿意,请忽略它)

标签: django django-forms django-csrf


【解决方案1】:

尝试将@csrf_protect 添加到您的视图中

@csrf_protect
def urlvotes(request):

    if request.method=='POST':
        if 'voteup' in request.POST:
            v=Imgurl(forloop.counter)
            v.urlvote +=1
    else:
        pass
    votetotal=v.urlvote # attempt to give the template some kind of context
    return render_to_response('display.html', {'votetotal':votetotal}, context_instance=RequestContext(request))

【讨论】:

  • 谢谢,这几乎奏效了,我认为这只是我在某处错过的微不足道的事情。
  • 顺便说一句,我在使用较旧的 django 教程时收到另一个 403 错误 - 清除浏览器的 cookie 解决了问题...
猜你喜欢
  • 2012-10-29
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
相关资源
最近更新 更多