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

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 深夜国产福利99亚洲视频| 亚洲乱码中文字幕综合 | 中文字幕免费视频精品一| 免费一级特黄特色大片在线观看| 亚洲乱码日产精品一二三| 国产精品视频免费一区二区| 亚洲午夜久久久精品电影院| 久久久久免费看黄A片APP| 亚洲日本中文字幕天天更新| 国产男女猛烈无遮档免费视频网站| 亚洲欧美日本韩国| 免费h成人黄漫画嘿咻破解版| 黄人成a动漫片免费网站| 亚洲欧洲国产成人综合在线观看| 亚洲精品视频免费| 亚洲国产日韩一区高清在线| 亚洲毛片免费观看| 亚洲欧洲av综合色无码| 亚洲 综合 国产 欧洲 丝袜| 丁香花在线观看免费观看图片| 无码乱人伦一区二区亚洲一| 成年网站免费视频A在线双飞| 亚洲av无码兔费综合| 亚洲日韩中文在线精品第一| 一级毛片免费不卡在线| 国产精品亚洲自在线播放页码| 国产伦精品一区二区三区免费迷| a级毛片免费网站| 亚洲午夜电影在线观看高清| 免费欧洲美女牲交视频| 中国内地毛片免费高清| 亚洲午夜一区二区电影院| 国产精品另类激情久久久免费| 免费网站观看WWW在线观看| 亚洲香蕉久久一区二区| 亚洲国产成人久久笫一页| 最近最好最新2019中文字幕免费| 亚洲精品无码专区久久| 亚洲va无码专区国产乱码| 成人免费看片又大又黄| 两个人看的www免费高清 |