<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Natural

     

    Django官方文檔學習筆記:Tutorial: Part 4

        繼續折騰這個投票應用,本章主要講如何處理表單。   

        一、寫一個表單
        修改原來的detail.html模板("polls/templates/polls/detail.html"):
    <h1>{{ poll.question }}</h1>

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

    <form action="{% url 'polls: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>
        forloop.counter         for循環的次數
        {% csrf_token %}    避免別的網站偽造post請求數據。

        如代碼所描述的,post之后會跳到vote去,修改poll應用的views.py("polls/views.py")實現一下vote響應方法。
    # Create your views here.
    from django.shortcuts import get_object_or_404, render
    from django.http import HttpResponse, HttpResponseRedirect
    from django.core.urlresolvers import reverse

    from polls.models import Poll, Choice

    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):
            
    return render(request, 'polls/detail.html', {
                                                         
    'poll': p,
                                                         
    'error_message'"You din'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    根據key訪問post提交的數據。同理get請求則使用request.GET
        request.POST['choice']    如果post數據中沒有choice,會爆出KeyError異常。
        HttpResponseRedirect    頁面重定向。避免post多次。
        reverse()    調用url鏈接,避免硬編碼。

        創建results模板文件("polls/templates/polls/results.html")
    <h1>{{ poll.question }}</h1>

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

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

        二、使用通用視圖:減少代碼
        在web開發中,從數據庫查詢,并渲染模板頁面到顯示,這是個很常見的情況。Django提供了一個用來快速生成視圖的“generic views”系統。可以將通用的ListView、DetailView的渲染通過它在URLconf中完成。
        修改URLconf
        修改poll應用的urls配置文件("polls/urls.py"):
    from django.conf.urls import patterns, url
    from django.views.generic import ListView
    from django.views.generic.detail import DetailView
    from polls.models import Poll

    urlpatterns 
    = patterns('',
        
    # ex: /polls/
        url(r'^$', ListView.as_view(queryset=Poll.objects.order_by('-pub_date')[:5],
                                    context_object_name
    ='latest_poll_list',
                                    template_name
    ='polls/index.html'), name='index'),
        
    # ex: /polls/5/
        url(r'^(?P<pk>\d+)/$', DetailView.as_view(
                                                       model
    =Poll,
                                                       template_name
    ='polls/detail.html'
                                                       ), name
    ='detail'),
        
    # ex: /polls/5/results/
        url(r'^(?P<pk>\d+)/results/$', DetailView.as_view(
                                                       model
    =Poll,
                                                       template_name
    ='polls/results.html'
                                                       ), name
    ='results'),
         
    # ex: /polls/5/vote/
        url(r'^(?P<poll_id>\d+)/vote/$''polls.views.vote', name='vote'),
    )
       
        修改views
        到此,可以把原視圖("polls/views.py")中的index()、detail()、results()方法刪掉了。

        這里使用了ListView、DetailView。需要注意的是,DetailView使用“pk”去匹配url中的id。
        DetailView、ListView默認分別調用“<app_name>/<model_name>_detail.html”、“<app_name>/<model_name>_list.html”模板,可以通過“template_name”參數指定特定的模板。
        ListView默認生成的傳遞給模板的上下文變量為“<model_name>_list”,可通過“context_object_name”參數來指定傳輸變量。
       

    posted on 2013-05-10 15:36 此號已被刪 閱讀(658) 評論(0)  編輯  收藏 所屬分類: Python

    導航

    統計

    常用鏈接

    留言簿(8)

    隨筆分類(83)

    隨筆檔案(78)

    文章檔案(2)

    相冊

    收藏夾(7)

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲国产综合第一精品小说| 91麻豆国产自产在线观看亚洲| 亚洲综合久久成人69| 久久永久免费人妻精品| 国产亚洲欧洲精品| 免费人妻无码不卡中文字幕系| 亚洲国产女人aaa毛片在线| 99re6在线视频精品免费下载| 亚洲成a人片7777| 三年片在线观看免费观看高清电影 | 亚洲精品精华液一区二区| 日本免费中文字幕在线看| 黄页网站在线免费观看| 亚洲日韩国产精品乱| 两个人看的www高清免费视频| 国产亚洲高清不卡在线观看| 久久国产色AV免费看| 亚洲免费观看网站| 日韩成全视频观看免费观看高清| 美女视频黄频a免费| 亚洲人成色777777在线观看| 7x7x7x免费在线观看| 亚洲私人无码综合久久网| 免费一级特黄特色大片在线观看| 国产97视频人人做人人爱免费| 亚洲av日韩av不卡在线观看| 免费在线看v网址| 黄色免费在线网址| 久久亚洲一区二区| 91香蕉视频免费| 一级成人a免费视频| 亚洲综合激情六月婷婷在线观看| 女人张开腿给人桶免费视频| 国产高清视频免费在线观看| 中文字幕亚洲精品资源网| 国产精品无码一区二区三区免费| a视频在线观看免费| 亚洲国产日韩精品| 亚洲免费观看视频| 女人张腿给男人桶视频免费版| 免费无码作爱视频|