Django-如何从用户输入中递增整数字段?

Django-如何从用户输入中递增整数字段?,django,Django,我是Django的新手,但我正在建立一个网站,人们可以在这个网站上就某些有争议的话题发表声明。现在,我只是为每次辩论手动添加了一些声明,我希望用户能够对声明进行“投票” 以下是我现在掌握的代码: 来自models.py的代码 class Debate(models.Model): title = models.CharField(max_length=50) description = models.CharField(max_length=100) pub_date =

我是Django的新手,但我正在建立一个网站,人们可以在这个网站上就某些有争议的话题发表声明。现在,我只是为每次辩论手动添加了一些声明,我希望用户能够对声明进行“投票”

以下是我现在掌握的代码:

来自models.py的代码

class Debate(models.Model):
    title = models.CharField(max_length=50)
    description = models.CharField(max_length=100)
    pub_date = models.DateTimeField('Date Published')
    url_slug = models.SlugField(editable=False)
    def __unicode__(self):
        return self.title

class Statement(models.Model):
    statement = models.CharField(max_length=200)
    debate = models.ForeignKey(Debate)
    votes = models.IntegerField(default=0)
    user = models.ForeignKey(User)
    def __unicode__(self):
        return self.statement
来自views.py的代码

def debate_page(request, url_slug):
    if request.method == 'POST':
        for statement in statements:
            statement.votes = statement.votes+1

    debate = Debate.objects.get(url_slug=url_slug)
    template = get_template('debate_page.html')
    statements = Statement.objects.filter(debate=debate)

    variables = Context ({
        'debate_title': debate.title,
        'debate_description': debate.description,
        'statements': statements,
    })

    output = template.render(variables)
    return HttpResponse(output)
来自模板的代码

{% extends "base.html" %}
{% block title %}{{ debate_title }}{% endblock %}
{% block head %}{{ debate_title }}{% endblock %}
{% block description %}{{ debate_description }}{% endblock %}
{% block content %} 
        {% for statement in statements %}
            <li>{{ statement }} - {{ statement.votes }}
            <input type="checkbox" name="statement" value="{{ statement.id }}" /></li><br />
        {% endfor %}
        <input type="submit" value="Submit" />      
{% endblock %}
{%extends“base.html”%}
{%block title%}{{discusion_title}{%endblock%}
{%block head%}{{discussion_title}{%endblock%}
{%block description%}{{discusion_description}{%endblock%}
{%block content%}
{%for语句中的语句%}
  • {{statement}}-{{statement.vows}

  • {%endfor%} {%endblock%}
    因此,我希望访问者选中他们同意的声明旁边的复选框,然后单击提交按钮。这样做将使语句的“投票数”属性增加1。我就是不知道如何获取用户输入并对数据库进行更改


    谢谢

    您可以使用

    statements = request.POST.getlist('statement')
    
    从该列表中,您可以增加投票数并更新数据库,如

    for st in statements:
        statement = Statement.objects.get(id=st)
        statement.vote += 1
        statement.save()
    

    希望这对您有所帮助。

    kyiphyu的代码可以通过以下方式进一步简化:


    django请求对象将post数据保存在类似字典的对象中。您可以使用它来获取post数据。增量将通过导入适当的模型并将其投票数增加1来完成。对不起,我是Django的新手,虽然您的回答可能对某些人有所帮助,但我不明白如何执行您所说的。这将导致大量SQL查询,Matt的解决方案将在单个查询中执行。后者不仅更快,而且更安全。此代码还具有竞争条件,不应使用。感谢您的评论!我会注意的。为了回应其他评论,此代码是不安全的,不应在中使用production@tuomassalo您需要将其封装在事务块中需要指出的一点是。
    from django.db.models import F
    
    Statement.objects.filter(id__in=statements).update(vote=F('vote') + 1)