Django学习笔记(七)

编写一个简单的窗体

我们先更新一下detail的代码,里面包含HTML的<from>元素

<h1>{{ poll.account }}</h1>

{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}

<form action="{% url 'jobs:vote' poll.id %}" method="post">
{% csrf_token %}
{% for choice in poll.choice_set.all %}
    <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
    <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br />
{% endfor %}
<input type="submit" value="Vote" />
</form>

这个功能也就是像人人网别人的首页上点赞一样,你认同,就在合适的地发点赞。我们来先修改一下views的vote和results,先在整个views应该是这样子的

from django.http import HttpResponse,HttpResponseRedirect
from django.core.urlresolvers import reverse
from jobs.models import Register,Choice
from django.shortcuts import render, get_object_or_404

def index(request):
    latest_jobs_list = Register.objects.order_by('time')
    return render(request, 'jobs/index.html', {'latest_jobs_list': latest_jobs_list})

def detail(request, r_id):
    poll=get_object_or_404(Register,pk=r_id)
    return render(request,'jobs/detail.html',{'poll':poll})

def results(request, r_id):
    poll = get_object_or_404(Register, pk=r_id)
    return render(request, 'jobs/results.html', {'poll': poll})

def vote(request, r_id):
    p = get_object_or_404(Register, pk=r_id)
    try:
        selected_choice = p.choice_set.get(pk=request.POST['choice'])
    except (KeyError, Choice.DoesNotExist):
        return render(request, 'jobs/detail.html', {
            'poll': p,
            'error_message': "You didn't select a choice.",
        })
    else:
        selected_choice.votes += 1
        selected_choice.save()
        return HttpResponseRedirect(reverse('jobs:results', args=(p.id,)))

解释:

request.POST:是一个类似字典的对象,可以通过获取关键字的值来获取提交的数据,本例子中的request.POST['choice']返回啦所选投票项目的id,以字符串的形式。

如果没有指定POST的值的时候,会引发KeyError事件。

在增加了投票选项的统计数后,代码返回一个 HttpResponseRedirect 对象而不是常见的 HttpResponse 对象。 HttpResponseRedirect 对象需要一个参数:用户将被重定向的 URL 。

我们在 HttpResponseRedirect 的构造方法中使用了 reverse() 函数。 此函数有助于避免在视图中硬编码 URL 的功能。它指定了我们想要的跳转的视图函数名以及视图函数中 URL 模式相应的可变参数。在本例中 reverse() 将会返回类似如下所示的字符串'/polls/3/results/'在此 3 就是 p.id 的值。该重定向 URL 会调用 'results' 视图并显示最终页面。

然后我们编辑result.html页面

<h1>{{ poll.account }}</h1>

<ul>
{% for choice in poll.choice_set.all %}
    <li>{{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}</li>
{% endfor %}
</ul>

<a href="{% url 'jobs:detail' poll.id %}">Vote again?</a>

先在访问 http://127.0.0.1:8009/jobs/1/赞。然后就能及时地更新。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值