寫(xiě)第一個(gè)Django應(yīng)用(四)


寫(xiě)一個(gè)簡(jiǎn)單的表單

為了在投票系統(tǒng)的詳細(xì)頁(yè)面中加入表單元素<form>,我們需要更新頁(yè)面的模板。
polls/templates/polls/detail.html

<h1>{{ question.quesiton_text }}</h1>

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

<form action="{ % url "polls:vote" question.id %}" method="post">
{% csrf_token %}
{% for choice in question.choice_set.all %}
    <input type="radio" name="choice" id="choice{{ forloop.counter }} value="{{ choice.id }}"/>
    <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label>
{% endfor %}
<input type="submit" value="vote"/>
</form>

一份簡(jiǎn)單的解釋?zhuān)?/p>

  • 上面的模板包含了一個(gè)問(wèn)題的單選表單。每個(gè)單選按鈕的值是問(wèn)題的選項(xiàng)id。每個(gè)單選按鈕的名字都是"choice"。當(dāng)有人選中了一個(gè)按鈕并提交表單時(shí),會(huì)發(fā)送POST數(shù)據(jù)choice=#(#表示選擇的選項(xiàng)id)。
  • 我們?cè)O(shè)置表單的action{% url "polls:vote" question.id %},method="post"。使用method="post"很重要,因?yàn)樘峤槐韱蔚膭?dòng)作會(huì)改變服務(wù)端的數(shù)據(jù)。當(dāng)你創(chuàng)建了一個(gè)會(huì)改變服務(wù)端數(shù)據(jù)的表單時(shí),一定要使用method="post"。
  • forloop.counter表示for標(biāo)簽已經(jīng)循環(huán)的次數(shù)。
  • 因?yàn)閯?chuàng)建了一個(gè)POST表單,我們需要擔(dān)心跨站請(qǐng)求偽造的攻擊(簡(jiǎn)稱(chēng)為CSRF,全稱(chēng)Cross Site Request Forgeries)。Django使用{% csrf_token %}標(biāo)簽來(lái)保護(hù)服務(wù)器不受CSRF的攻擊。很好用,不是嗎?
    現(xiàn)在,我們將創(chuàng)建一個(gè)Django視圖函數(shù)來(lái)處理提交的數(shù)據(jù),并使用這些數(shù)據(jù)完成一些功能。記的嗎,在教程三里,我們?yōu)橥镀毕到y(tǒng)創(chuàng)建了一個(gè)URL清單?
    polls/urls.py
url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),

在上個(gè)教程中我們創(chuàng)建了一個(gè)沒(méi)有實(shí)現(xiàn)投票功能的vote()函數(shù),但是下面將實(shí)現(xiàn)該功能:
polls/views.py

from django.shortcuts import render, 
get_object_or_404
from django.http import HttpResponse, HttpResponseRedirect
from django.urls import reverse
from .models import Choice, Question
def vote(request, question_id):
    question = Question.objects.get(pk=question_id)
    try:
        selected_choice = question.choice_set.get(pk=request.POST['choice'])
    except (KeyError, Choice.DoesNotExist):
        return render(request, 'polls:vote', {'question': question, 'error_message': 'oh, did not choose a radio.'}) 
   
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容