七日Python之路--第三天(之初試Django 2-2)

接上文。前面(1)(2)部分已經實現瀏覽器訪問工程項目,而且能後臺管理新建立的app。html

    (二)第一個Django的apppython


        (3)教你開始寫Django1.6的第1個app正則表達式

            前面已經完成了model(M)的設置。剩下的只有view(V)和urls(C)了。Django的視圖部分,由views.py 和 templates完成。shell

            在polls中,咱們將建立4個視圖:django

「index」 列表頁 – 顯示最新投票。
「detail」 投票頁 – 顯示一個投票的問題, 以及用戶可用於投票的表單。
「results」 結果頁 – 顯示一個投票的結果。
投票處理 – 對用戶提交一個投票表單後的處理。

            如今修改 views.py 建立用於視圖的函數。vim

dizzy@dizzy-pc:~/Python/mysite$ vim polls/views.py

from django.shortcuts import render,get_object_or_404

# Create your views here.
from django.http import HttpResponse
from polls.models import Poll

def index(request):
    latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
    context = {'latest_poll_list':latest_poll_list}
    return render(request,'polls/index.html',context)

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

def results(request,poll_id):
    return HttpResponse("you're looking at the results of poll %s." % poll_id)

def vote(request,poll_id):
    return HttpResponse("you're voting on poll %s." % poll_id)

#涉及Django的自帶函數,不作深究。後面再作研究!

            要想使試圖能被訪問,還要配置 urls.py 。mysite是整個網站的URLConf,但每一個app能夠有本身的URLConf,經過include的方式導入到根配置中便可。如今在polls下面新建 urls.py瀏覽器

from django.conf.urls import patterns,url

from polls import views

urlpatterns = patterns('',
    #ex:/polls/
    url(r'^$',views.index,name='index'),
    #ex:/polls/5/
    url(r'^(?P<poll_id>\d+)/$',views.detail,name='detail'),
    #ex:/polls/5/results/
    url(r'^(?P<poll_id>\d+)/results/$',views.results,name='results'),
    #ex:/polls/5/vote/
    url(r'^(?P<poll_id>\d+)/vote/$',views.vote,name='vote'),
)
#url中,三個參數。正則的url,處理的函數,以及名稱
#正則表達式!!!!!

            而後在根 urls.py 文件中,include這個文件便可。app

dizzy@dizzy-pc:~/Python/mysite$ vim mysite/urls.py

from django.conf.urls import patterns, include, url

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'mysite.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),

    url(r'^polls/', include('polls.urls',namespace="polls")),
    url(r'^admin/', include(admin.site.urls)),
)
#有Example:兩種形式。由於是元組,因此開始有「 ‘’, 」。

            而後開始建立模板文件。在polls下,建立templates文件夾。下面有index.html, detail.html 兩個文件。函數

<!-- index.html -->
{% if latest_poll_list %}
    <ul>
    {% for poll in latest_poll_list %}
        <li><a href="{% url 'polls:detail' poll_id=poll.id %}">{{ poll.question }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}

<!--detail.html-->
<h1>{{ poll.question }}</h1>
<ul>
{% for choice in poll.choice_set.all %}
    <li>{{ choice.choice_text }}</li>
{% endfor %}
</ul>

<!-- 視圖設置完畢,具體語法還要深刻研究! -->
<!-- 如今重啓服務, 即可看到相應視圖  -->

        (4)教你開始寫Django1.6的第1個appoop

            上面只是簡單的實現了視圖功能,並無真正的實現投票功能。接下來就是完善功能。

#修改模板文件
dizzy@dizzy-pc:~/Python/mysite$ vim polls/templates/polls/detail.html
#須要加入form表單
<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>

            而後須要修改 views.py 中的 vote 處理函數。進行post數據的接收與處理。

# 文件 polls/views.py

from django.shortcuts import get_object_or_404, render
from django.http import HttpResponseRedirect, HttpResponse
from django.core.urlresolvers import reverse
from 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,)))

            在投票成功以後,讓用戶瀏覽器重定向到結果 results.html 頁。

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

            而後就須要建立模板 results.html 。

<!-- 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>
 
<a href="{% url 'polls:detail' poll.id %}">Vote again?</a>

            至此,重啓服務就能看到單選按鈕,以及submit了。


            but,發現這個居然是官網上的例子..........................Orz...................


    源地址:https://docs.djangoproject.com/en/1.6/ Django1.6 官方文檔           看來本身又犯二了......    仍是等着明後天的看官方文檔吧!!!

                                                                                                

                                                                                                    --2014.7.23 16:44

相關文章
相關標籤/搜索