Do chéad aip Django a scríobh, cuid 4Link to this heading
Tosaíonn an rang teagaisc seo nuair a d'fhág Tutorial 3 as. Táimid ag leanúint leis an iarratas vótaíochta gréasáin agus díreoimid ar phróiseáil foirmeacha agus ar ár gcód a ghearradh síos.
Scríobh foirm íostaLink to this heading
Déanaimis ár dteimpléad sonraí vótaíochta ("vótaí/detail.html") a nuashonrú ón teagasc deiridh, ionas go mbeidh eilimint HTML `` <form>`` sa teimpléad:
polls/templates/polls/detail.html<form action="{% url 'polls:vote' question.id %}" method="post">
{% csrf_token %}
<fieldset>
<legend><h1>{{ question.question_text }}</h1></legend>
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
{% 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><br>
{% endfor %}
</fieldset>
<input type="submit" value="Vote">
</form>
Léiriú tapa:
Taispeánann an teimpléad thuas cnaipe raidió do gach rogha ceiste. Is é
luachgach cnaipe raidió ná ID an rogha ceiste gaolmhar. Is éainmgach cnaipe raidió ná"rogha". Ciallaíonn sé sin, nuair a roghnaíonn duine éigin ceann de na cnaipí raidió agus nuair a sheolann sé isteach an fhoirm, seolfaidh sé na sonraí POST `` rogha = #`` áit arb é # ID an rogha roghnaithe. Is é seo an coincheap bunúsach foirmeacha HTML.Shocraigh muid
gníomhna foirme go{%url' vótaíocht:vóta' question.id %}, agus leagamar síosmodh="post". Tá sé an-tábhachtach úsáid a bhaint asmodh="post"(seachasmodh="faigh") mar go n-athróidh an gníomh chun an fhoirm seo a chur isteach taobh an fhreastalaí sonraí. Aon uair a chruthaíonn tú foirm a athraíonn taobh an fhreastalaí sonraí, úsáid `` method="post"``. Ní bhaineann an leid seo go sonrach le Django; is dea-chleachtas forbartha gréasáin é go ginearálta.Léiríonn
forloop.countercá mhéad uair a chuaigh an chlibfortrína lúbÓs rud é go bhfuil foirm POST á cruthú againn (ar féidir leis an éifeacht sonraí a mhodhnú), ní mór dúinn a bheith buartha faoi Bhronntanais Iarratas Trasláithreáin. Ar an dea-uair, ní gá duit a bheith buartha ró-chrua, mar tagann Django le córas cabhrach chun é a chosaint. I mbeagán focal, ba cheart do gach foirm POST atá dírithe ar URLanna inmheánacha an chlib teimpléad
{% csrf_token %}a úsáid.
Anois, déanaimis radharc Django a chruthú a láimhseálann na sonraí a cuireadh isteach agus a dhéanann rud éigin leis. Cuimhnigh, i Teagasc 3, chruthaigh muid URLconf don fheidhmchlár vótaíochta a chuimsíonn an líne seo:
polls/urls.pypath("<int:question_id>/vote/", views.vote, name="vote"),
Chruthaíomar freisin cur i bhfeidhm caochadán den fheidhm vóta()`. A ligean ar a chruthú leagan fíor. Cuir iad seo a leanas le ``vótaíocht/views.py:
polls/views.pyfrom django.db.models import F
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
from django.urls import reverse
from .models import Choice, Question
# ...
def vote(request, question_id):
question = get_object_or_404(Question, pk=question_id)
try:
selected_choice = question.choice_set.get(pk=request.POST["choice"])
except (KeyError, Choice.DoesNotExist):
# Redisplay the question voting form.
return render(
request,
"polls/detail.html",
{
"question": question,
"error_message": "You didn't select a choice.",
},
)
else:
selected_choice.votes = F("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=(question.id,)))
Áiríonn an cód seo roinnt rudaí nach bhfuil clúdaithe againn fós sa rang teagaisc seo:
request.POSTis réad atá cosúil le foclóir a ligeann duit rochtain a fháil ar shonraí a cuireadh isteach de réir eochairainm. Sa chás seo, cuireanniarratas.POST['rogha']ID na rogha roghnaithe ar ais, mar theaghrán.request.POSTis teaghráin i gcónaí iad na luachanna.Tabhair faoi deara go soláthraíonn Django freisin
request.GETchun sonraí GET a rochtain ar an mbealach céanna -- ach táimid ag baint úsáide asrequest.POSTinár gcód, chun a chinntiú nach n-athraítear sonraí ach trí ghlao POST.Ardóidh
iarratas.POST['rogha']Earráid Eochairmurar soláthraíodhroghai sonraí POST. Seiceálann an cód thuas le haghaidhKeyErroragus ath-thaispeánann sé an fhoirm cheiste le teachtaireacht earráide mura dtugtarrogha.Tugann
F ("vótaí") + 1:ref:` treoir don bhunachar sonraí <avoiding-race-conditions-using-f>` líon na vótaí a mhéadú faoi 1.Tar éis an comhaireamh rogha a mhéadú, cuireann an cód ar ais :rang:`~django.http.HttpResponseRedirect` seachas gnáth:rang:~django.http.HttpResponse.
HttpResponseRedirecta thógann argóint amháin: an URL a mbeidh an t-úsáideoir a atreorú (féach an pointe seo a leanas le haghaidh conas a dhéanfaimid an URL sa chás seo).Mar a léiríonn an trácht Python thuas, ba cheart duit
HttpResponseRedirecta chur ar ais i gcónaí tar éis déileáil go rathúil le sonraí POST. Ní bhaineann an leid seo go sonrach le Django; is dea-chleachtas forbartha gréasáin é go ginearálta.Táimid ag baint úsáide as an bhfeidhm
reverse()sa chruthaitheoirHttpResponseRedirectsa sampla seo. Cuidíonn an fheidhm seo le cód crua URL a sheachaint san fheidhm radhairc. Tugtar ainm an dearcadh a dteastaíonn uainn rialú a thabhairt dó agus an chuid athraitheach den phatrún URL a dhíríonn ar an dearcadh sin. Sa chás seo, ag baint úsáide as an URLconf a bhunaigh muid i Teagasc 3, seoreverse()cuirfidh an glaoch seo ar ais teaghrán mar"/polls/3/results/"áit a bhfuil an
3luachcheist.id. Glaofaidh an URL atreoraithe seo ar an radharc'torthaí'chun an leathanach deiridh a thaispeáint.
Mar a luadh in Teagasc 3, is :aicme:`~django.http.HttpRequest` é iarratas. Le haghaidh tuilleadh eolais ar HttpRequest réada, féach ar an doiciméadú iarratais agus freagartha.
Tar éis do dhuine vóta a chaitheamh i gceist, atreoraíonn an radharc vóta() chuig leathanach torthaí na ceiste. Scríobhaimis an tuairim sin:
polls/views.pyfrom django.shortcuts import get_object_or_404, render
def results(request, question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, "polls/results.html", {"question": question})
Tá sé seo beagnach díreach mar a chéile leis an radharc detail() ó Teagasc 3. Is é an t-aon difríocht ná an t-ainm teimpléad. Déanfaimid an iomarcaíocht seo a réiteach níos déanaí.
Anois, cruthaigh teimpléad polls/results.htmll:
polls/templates/polls/results.html<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
<li>{{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}</li>
{% endfor %}
</ul>
<a href="{% url 'polls:detail' question.id %}">Vote again?</a>
Tá sé seo beagnach díreach mar a chéile leis an radharc ``detail()``ó :doc: Teagasc 3 </intro/tutorial03>. Is é an t-aon difríocht ná an t-ainm teimpléad. Déanfaimid an iomarcaíocht seo a réiteach níos déanaí.
Úsáid tuairimí cineálach: Is fearr níos lú códLink to this heading
Tá sé seo beagnach díreach mar a chéile leis an radharc ``detail()``ó :doc: Teagasc 3 </intro/tutorial03>. Is é an t-aon difríocht ná an t-ainm teimpléad. Déanfaimid an iomarcaíocht seo a réiteach níos déanaí.
Is ionann na tuairimí seo agus cás coiteann d'fhorbairt bhunúsach gréasáin: sonraí a fháil ón mbunachar sonraí de réir paraiméadar a ritheadh san URL, teimpléad a lódáil agus an teimpléad rindreáilte a sheoladh ar ais. Toisc go bhfuil sé seo chomh coitianta, soláthraíonn Django aicearra, ar a dtugtar an córas "tuairimí cineálacha".
Teibríonn tuairimí cineálacha patrúin choitianta go dtí an pointe nach gá duit fiú cód Python a scríobh chun aip a scríobh. Mar shampla, déanann an :rang:`~django.views.generic.list.ListView` agus DetailView tuairimí cineálacha a achoimríonn na coincheapa "taispeáin liosta réad" agus" taispeáin leathanach mionsonraí do chineál áirithe réad" faoi seach.
Déanaimis ár n-aip vótaíochta a thiontú chun an córas tuairimí cineálach a úsáid, ionas gur féidir linn ár gcód féin a scriosadh. Beidh orainn a ghlacadh roinnt céimeanna a dhéanamh ar an chomhshó. Déanfaimid:
Tiontaigh URLconf.
Scrios cuid de na seanamharcanna nach bhfuil ag teastáil.
Tabhair isteach tuairimí nua bunaithe ar thuairimí cineálacha Django.
Léigh ar aghaidh le haghaidh sonraí.
Leasaigh URLconfLink to this heading
Ar dtús, oscail an URLconf `` polls/urls.py`` agus athraigh é mar sin:
polls/urls.pyfrom django.urls import path
from . import views
app_name = "polls"
urlpatterns = [
path("", views.IndexView.as_view(), name="index"),
path("<int:pk>/", views.DetailView.as_view(), name="detail"),
path("<int:pk>/results/", views.ResultsView.as_view(), name="results"),
path("<int:question_id>/vote/", views.vote, name="vote"),
]
Tabhair faoi deara go bhfuil ainm an phatrúin chomhoiriúnaithe i teaghráin chosáin an dara agus an tríú patrún athraithe ó <question_id> go <pk>. Tá sé seo riachtanach toisc go n-úsáidfimid an radharc cineálach DetailView chun ár radharcanna detail() agus torthaí() a chur in ionad ár n-amharc detail() agus torthaí (), agus tá sé ag súil leis na radharcanna príomhluach eochrach a gabhadh ón URL ar a dtabharfar "pk".
Leasú ar radharcannaLink to this heading
Ansin, bainfimid ár seanamharcanna `` index``, sonraí, agus torthaí agus úsáidfimid radharcanna cineálacha Django ina ionad sin. Chun é sin a dhéanamh, oscail an comhad vótaíocht/views.py agus athraigh é mar a leanas:
polls/views.pyfrom django.db.models import F
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
from django.urls import reverse
from django.views import generic
from .models import Choice, Question
class IndexView(generic.ListView):
template_name = "polls/index.html"
context_object_name = "latest_question_list"
def get_queryset(self):
"""Return the last five published questions."""
return Question.objects.order_by("-pub_date")[:5]
class DetailView(generic.DetailView):
model = Question
template_name = "polls/detail.html"
class ResultsView(generic.DetailView):
model = Question
template_name = "polls/results.html"
def vote(request, question_id):
# same as above, no changes needed.
...
Ní mór go mbeadh a fhios ag gach dearcadh cineálach cén samhail a mbeidh sé ag feidhmiú air. Soláthraítear é seo trí úsáid a bhaint as an aitreabúid model (sa sampla seo, `` model = Ceist`` le haghaidh DetailView agus ResultsView) nó trí na get_queryset() (mar a thaispeántar in IndexView).
De réir réamhshocraithe, úsáideann an t-amharc cineálach DetailView teimpléad darb ainm `` <ainm an fheidhmchláir>/<ainm an mhúnla>_detail.html``. Inár gcás, d'úsáidfeadh sé an teimpléad "vótaíocht/question_detail.html". Úsáidtear an aitreabúid template_name chun a rá le Django ainm teimpléid ar leith a úsáid in ionad ainm an teimpléid réamhshocraithe uathghinte. Sonraimid freisin an ainm_teimpléad don amharc liosta torthaí -- cinntíonn sé seo go mbíonn cuma dhifriúil ar amharc na dtorthaí agus ar an mionradharc nuair a rindreáiltear iad, cé gur DetailView taobh thiar de na radhairc.
Ar an gcaoi chéanna, úsáideann an t-amharc cineálach ListView teimpléad réamhshocraithe ar a dtugtar `` <ainm an fheidhmchláir>/<ainm samhail>_list.html``; úsáidimid template_name chun ListView a insint chun ár teimpléad reatha "vótaíocht/index.html" a úsáid.
I gcodanna roimhe seo den rang teagaisc, cuireadh comhthéacs ar fáil do na teimpléid ina bhfuil na hathróga comhthéacs ceist agus `` is déanaí_cheist_liosta``. I gcás DetailView cuirtear an athróg ceist ar fáil go huathoibríoch -- ós rud é go bhfuil múnla Django in úsáid againn (`` Ceist``), tá Django in ann ainm oiriúnach a chinneadh don athróg comhthéacs. I gcás ListView, áfach, is é question_list an athróg comhthéacs a ghintear go huathoibríoch. Chun é seo a shárú, cuirimid an aitreabúid context_object_name ar fáil, ag sonrú go dteastaíonn uainn liosta_ceisteanna_is déanaí a úsáid ina ionad sin. Mar chur chuige eile, d'fhéadfá do theimpléid a athrú chun na hathróga comhthéacs réamhshocraithe nua a mheaitseáil -- ach tá sé i bhfad níos éasca a rá le Django an athróg atá uait a úsáid.
Rith an freastalaí, agus úsáid d'aip vótaíochta nua bunaithe ar radhairc chineálacha.
Chun sonraí iomlána a fháil ar thuairimí cineálacha, féach an doiciméadú tuairimí cineálach.
Agus tú ar do chompord le foirmeacha agus le tuairimí cineálacha, léigh :doc: cuid 5 den rang teagaisc seo</intro/tutorial05> chun foghlaim faoinár bhfeidhmchlár pobalbhreithe a thástáil.