<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)

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 成人免费毛片内射美女APP| 久久久WWW成人免费精品| 亚洲成人免费网址| 亚洲AV无码成人精品区在线观看 | 中文字幕亚洲激情| 老司机午夜在线视频免费| 免费永久看黄在线观看app| 亚洲AV成人片无码网站| 国产又长又粗又爽免费视频| 激情无码亚洲一区二区三区| 国产午夜免费秋霞影院| 尤物视频在线免费观看| 亚洲午夜福利717| 国产真人无码作爱视频免费| 亚洲最大的成网4438| 91网站免费观看| 亚洲欧美日韩一区二区三区在线| 午夜一级免费视频| 老司机午夜性生免费福利| 亚洲熟妇无码AV在线播放| 国产一级淫片a免费播放口| 亚洲激情校园春色| 在线精品免费视频无码的| 免费无遮挡无码视频在线观看| 国产啪亚洲国产精品无码| 在线播放免费人成毛片乱码| 亚洲一线产区二线产区精华| 日本高清免费不卡视频| 一级毛片在线完整免费观看| 亚洲国产人成网站在线电影动漫| 免费在线看v网址| 牛牛在线精品观看免费正| 亚洲国产天堂久久综合网站 | 午夜福利不卡片在线播放免费| 亚洲国产精品18久久久久久 | 亚洲区视频在线观看| 国产成人免费手机在线观看视频 | 国产精品成人免费福利| 亚洲精品乱码久久久久久V | 亚洲成a人无码亚洲成www牛牛 | 特级毛片全部免费播放a一级|