博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
django 学习笔记(四)
阅读量:6245 次
发布时间:2019-06-22

本文共 3096 字,大约阅读时间需要 10 分钟。

hot3.png

四、Writing your first Django app, part 4

写一个简单的表单

继续Part 3的例子

1.修改 polls/detail.html 模版文件,增加form元素

{
{ poll.question }}

{% if error_message %}

{

{ error_message }}

{% endif %}
{% csrf_token %} {% for choice in poll.choice_set.all %}
{% endfor %}

注意事项:

  • 增加一些 radio 按钮,按钮的value是choice.id的值,提交的时候通过post中的choice值来处理
  • 使用 method="post" 方法
  • 提交的地址是 {% url 'polls:vote' poll.id %}
  • forloop.counter 是循环计数变量
  • 使用 {% csrf_token %} 避免跨站攻击

2.增加处理post数据的vote部分

完善polls/views.py

from django.shortcuts import get_object_or_404, renderfrom django.http import HttpResponseRedirect, HttpResponsefrom django.core.urlresolvers import reversefrom polls.models import Choice, Poll# ...def vote(request, poll_id):    p = get_object_or_404(Poll, pk=poll_id)    try:        selected_choice = p.choice_set.get(pk=request.POST['choice'])    except (KeyError, Choice.DoesNotExist):        # Redisplay the poll voting form.        return render(request, 'polls/detail.html', {            'poll': p,            'error_message': "You didn't select a choice.",        })    else:        selected_choice.votes += 1        selected_choice.save()        # Always return an HttpResponseRedirect after successfully dealing        # with POST data. This prevents data from being posted twice if a        # user hits the Back button.        return HttpResponseRedirect(reverse('polls:results', args=(p.id,)))

代码解读:

  • 使用 request.POST['choice'] 的方法访问 POST 数据
  • 如果在字典访问中找不到 choice key,抛出 KeyError 异常
  • 尽量使用HttpResponseRedirect 代替 HttpResponse
  • 通过使用 reverse()方法来避免在视图中写入硬编码的网址

3.完善结果显示的页面 results()

def results(request, poll_id):    poll = get_object_or_404(Poll, pk=poll_id)    return render(request, 'polls/results.html', {'poll': poll})

4.建立polls/results.html 模版文件

{
{ poll.question }}

    {% for choice in poll.choice_set.all %}
  • {
    { choice.choice_text }} -- {
    { choice.votes }} vote{
    { choice.votes|pluralize }}
  • {% endfor %}
Vote again?

使用通用视图来改写上面的例子

  • ListView
  • DetailView

1. 在urls.py中的设置

url(r'^$', views.IndexView.as_view(), name='index'),url(r'^(?P
\d+)/$', views.DetailView.as_view(), name='detail'),

2. 视图中的写法

from django.shortcuts import get_object_or_404, renderfrom django.http import HttpResponseRedirectfrom django.core.urlresolvers import reversefrom django.views import genericfrom polls.models import Choice, Pollclass IndexView(generic.ListView):    template_name = 'polls/index.html'    context_object_name = 'latest_poll_list'    def get_queryset(self):        """Return the last five published polls."""        return Poll.objects.order_by('-pub_date')[:5]class DetailView(generic.DetailView):    model = Poll    template_name = 'polls/detail.html'class ResultsView(generic.DetailView):    model = Poll    template_name = 'polls/results.html'def vote(request, poll_id):    ....

3.解读

  • pk作为主键 url(r'^(?P<pk>\d+)/$', views.DetailView.as_view(), name='detail'),
  • model 表的名称
  • template_name 模版的名称
  • context_object_name 自定义模版中的变量名称

转载于:https://my.oschina.net/bailiangcn/blog/228898

你可能感兴趣的文章
常用CSS记录
查看>>
我的友情链接
查看>>
DNS介绍和原理
查看>>
使用JIRA搭建企业问题跟踪系统3
查看>>
如何定位消耗CPU最多的线程
查看>>
Linux PAM 之cracklib模块
查看>>
buffer && cache
查看>>
Mockito
查看>>
android闹钟实现原理
查看>>
lamp
查看>>
2-12 Linux一些基础练习的实战资料整理
查看>>
在线图片处理的开源项目或开放平台
查看>>
移动设备硬件统计
查看>>
CoreData
查看>>
【step by step构建轻量级web框架】轻量级框架jbeer预览
查看>>
Spring2.5整合ActiveMQ 5.2
查看>>
浅析Struts1和Struts2的Action线程安全问题
查看>>
java-颠倒一个句子中的词的顺序。比如: I am a student颠倒后变成:student a am I
查看>>
HDU 2017
查看>>
yaml文件java的实现
查看>>