Do chéad aip Django a scríobh, cuid 3Link to this heading

Tosaíonn an rang teagaisc seo nuair a d'fhág Tutorial 2 as. Táimid ag leanúint leis an bhfeidhmchlár vótaíochta gréasáin agus díreoimid ar chomhéadan poiblí a chruthú -- "tuairimí."

ForbhreathnúLink to this heading

Is éard is dearcadh ann ná "cineál" de leathanach gréasáin i d'iarratas Django a fhreastalaíonn go ginearálta ar fheidhm shonrach agus a bhfuil teimpléad ar leith aige. Mar shampla, in iarratas blag, b’fhéidir go mbeadh na tuairimí seo a leanas agat:

  • Leathanach baile blag -- taispeánann sé na hiontrálacha is déanaí.

  • Iontráil "mionsonraí" leathanach -- leathanach permalink le haghaidh iontráil amháin.

  • Leathanach cartlainne bunaithe ar bhliain -- taispeánann sé gach mí le hiontrálacha sa bhliain ar leith.

  • Leathanach cartlainne bunaithe ar mhí -- taispeánann sé gach lá le hiontrálacha sa mhí ar leith.

  • Leathanach cartlainne bunaithe ar an lá -- taispeánann sé gach iontráil sa lá ar leith.

  • Gníomh tráchta -- Láimhseálann postáil tuairimí chuig iontráil tugtha.

In ár n-iarratas vótaíochta, beidh na ceithre radharc seo a leanas againn:

  • Ceist "innéacs" leathanach - taispeánann sé na ceisteanna is déanaí.

  • Leathanach "mionsonraí" Ceist -- taispeánann sé téacs ceiste, gan torthaí ach le foirm vótála.

  • Ceist "torthaí" leathanach -- taispeánann torthaí do cheist ar leith.

  • Vóta caingean - láimhseálann vótáil do rogha ar leith i gceist ar leith.

In Django, déantar leathanaigh ghréasáin agus ábhar eile a sheachadadh trí radharcanna. Léirítear gach radharc le feidhm Python (nó modh, i gcás radhairc rangbhunaithe). Roghnóidh Django radharc tríd an URL a iarrtar a scrúdú (le bheith beacht, an chuid den URL tar éis an ainm fearainn).

Anois agus tú i do chuid ama ar an ngréasán b'fhéidir gur tháinig tú trasna ar áilleachta mar ME2/Sites/dirmod.htm?sid=&type=gen&mod=Core+Pages&gid=A6CD4967199A42D9B65B1B. Beidh tú sásta a fhios go gceadaíonn Django patrúin * URL * i bhfad níos galánta dúinn ná sin.

Foirm ghinearálta URL is ea patrún URL - mar shampla: /newsarchive/<year>/<month>/.

Chun dul ó URL go radharc, úsáideann Django rud ar a dtugtar 'URLconfs'. Léarscáilíonn URLconf patrúin URL chun amharc orthu.

Soláthraíonn an rang teagaisc seo treoir bhunúsach maidir le húsáid URLconfs, agus is féidir leat tagairt a dhéanamh do URL dispatcher le haghaidh tuilleadh eolais.

Tuilleadh tuairimí á scríobhLink to this heading

Anois cuirimis cúpla radharc eile le vótaíocht/views.py. Tá na tuairimí seo beagán difriúil, toisc go nglacann siad argóint:

polls/views.py
Python
def detail(request, question_id):
    return HttpResponse("You're looking at question %s." % question_id)


def results(request, question_id):
    response = "You're looking at the results of question %s."
    return HttpResponse(response % question_id)


def vote(request, question_id):
    return HttpResponse("You're voting on question %s." % question_id)

Sreangaigh na radharcanna nua seo isteach sa mhodúl polls.urls tríd an méid seo a leanas a chur leis :func: glaonna ~ django.urls.path:

polls/urls.py
Python
from django.urls import path

from . import views

urlpatterns = [
    # ex: /polls/
    path("", views.index, name="index"),
    # ex: /polls/5/
    path("<int:question_id>/", views.detail, name="detail"),
    # ex: /polls/5/results/
    path("<int:question_id>/results/", views.results, name="results"),
    # ex: /polls/5/vote/
    path("<int:question_id>/vote/", views.vote, name="vote"),
]

Féach i do bhrabhsálaí, ag "/polls/34/". Rithfidh sé an fheidhm detail() agus taispeánfaidh sé cibé aitheantas a sholáthraíonn tú san URL. Bain triail as "/polls/34/results/" agus "/polls/34/vote/" freisin -- taispeánfaidh siad seo torthaí an tsealbhóra ionad agus na leathanaigh vótála.

Nuair a iarrann duine éigin leathanach ó do shuíomh Gréasáin -- abair, "/polls/34/", lódálfaidh Django an modúl Python mysite.urls toisc go bhfuil sé dírithe ag an socrú ROOT_URLCONF. Faigheann sé an athróg darb ainm urlpatterns agus trasnaíonn sé na patrúin in ord. Tar éis dó an meaits a aimsiú ag ` pobalbhreith/', scriosann sé an téacs meaitseála (" pobalbhreith / ") agus seolann sé an téacs atá fágtha -- `` "34/"`` -- chuig an ' URLconf polls.urls le haghaidh tuilleadh próiseála. Is amhlaidh a mheaitseálann sé ' <int:question_id>/', agus glao ar an radharc detail() mar seo a leanas:

Python console
detail(request=<HttpRequest object>, question_id=34)

Tagann an chuid question_id=34 ó `` <int:question_id>``. Ag baint úsáide as lúibíní uillinn "gabhálann" cuid den URL agus seolann sé mar argóint eochairfhocal chuig an bhfeidhm radhairc. Sainmhíníonn an chuid question_id den teaghrán an t-ainm a úsáidfear chun an patrún comhoiriúnaithe a shainaithint, agus is tiontaire é an chuid int a shocraíonn cé na patrúin ba cheart a bheith ag teacht leis an gcuid seo den chonair URL. Scarann ​​an colon (:) an t-ainm tiontaire agus patrún.

Scríobh tuairimí a dhéanann rud éigin i ndáiríreLink to this heading

Tá gach amharc freagrach as ceann amháin de dhá rud a dhéanamh: réad HttpResponse a thabhairt ar ais ina bhfuil an t-ábhar don leathanach iarrtha, nó eisceacht a ardú mar Http404 . Tá an chuid eile suas duit.

Is féidir le do radharc taifid ó bhunachar sonraí a léamh, nó ní féidir. Is féidir leis córas teimpléid a úsáid mar Django's -- nó córas teimpléid Python tríú páirtí -- nó nach bhfuil. Is féidir leis comhad PDF a ghiniúint, XML a aschur, comhad ZIP a chruthú ar an eitilt, rud ar bith is mian leat, ag baint úsáide as cibé leabharlanna Python is mian leat.

Níl uait ach Django ná :rang:`~django.http.HttpResponse`. Nó eisceacht.

Toisc go bhfuil sé áisiúil, bainimis úsáid as API bunachar sonraí Django féin, a chlúdaigh muid i Teagasc 2. Seo stab amháin ag radharc nua innéacs(), a thaispeánann na 5 cheist vótaíochta is déanaí sa chóras, scartha le camóga, de réir dáta foilsithe:

polls/views.py
Python
from django.http import HttpResponse

from .models import Question


def index(request):
    latest_question_list = Question.objects.order_by("-pub_date")[:5]
    output = ", ".join([q.question_text for q in latest_question_list])
    return HttpResponse(output)


# Leave the rest of the views (detail, results, vote) unchanged

There's a problem here, though: the page's design is hardcoded in the view. If you want to change the way the page looks, you'll have to edit this Python code. So let's use Django's template system to separate the design from Python by creating a template that the view can use.

Ar dtús, cruthaigh eolaire darb ainm templates i do eolaire `` pobalbhreith ``. Féachfaidh Django le haghaidh teimpléid ann.

Déanann socrú :suíomh:`TEMPLATES` do thionscadal cur síos ar an gcaoi a ndéanfaidh Django teimpléid a luchtú agus a rindreáil. Cumraíonn an comhad socruithe réamhshocraithe inneall DjangoTemplates a bhfuil a rogha APP_DIRS socraithe go True. De réir an ghnáis lorgaíonn DjangoTemplates fochomhadlann "teimpléid" i ngach ceann de na :suíomh:`INSTALLED_APPS`.

Laistigh den eolaire templates atá díreach cruthaithe agat, cruthaigh eolaire eile ar a dtugtar `` pobalbhreith``, agus laistigh de sin cruthaigh comhad ar a dtugtar `` index.html``. Is é sin le rá, ba cheart go mbeadh do theimpléad ag vótaíocht/templates/polls/index.html. Mar gheall ar an gcaoi a n-oibríonn an lódóir teimpléid `` app_directories`` mar a thuairiscítear thuas, is féidir leat tagairt a dhéanamh don teimpléad seo laistigh de Django mar `` pobalbhreith / index.html ``.

Cuir an cód seo a leanas sa teimpléad sin:

polls/templates/polls/index.html
Django template
{% if latest_question_list %}
    <ul>
    {% for question in latest_question_list %}
        <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}

Anois déanaimis ár n-amharc innéacs a nuashonrú i vótaíocht/views.py chun an teimpléad a úsáid:

polls/views.py
Python
from django.http import HttpResponse
from django.template import loader

from .models import Question


def index(request):
    latest_question_list = Question.objects.order_by("-pub_date")[:5]
    template = loader.get_template("polls/index.html")
    context = {"latest_question_list": latest_question_list}
    return HttpResponse(template.render(context, request))

Luchtaíonn an cód sin an teimpléad ar a dtugtar vótaíocht/index.html agus cuireann sé comhthéacs air. Is é an comhthéacs ná teimpléad ag mapáil foclóra ainmneacha athróg ar oibiachtaí Python.

Lódáil an leathanach trí do bhrabhsálaí a dhíriú ar "/polls/", agus ba cheart duit liosta le hurchair a fheiceáil ina bhfuil an cheist "Cad atá ar bun" ó Teagasc 2. Léiríonn an nasc leathanach sonraí na ceiste.

Aicearra: render()Link to this heading

Is idiom an-choitianta é teimpléad a lódáil, comhthéacs a líonadh agus réad HttpResponse a sheoladh ar ais le toradh an teimpléid rindreáilte. Soláthraíonn Django aicearra. Seo an radharc iomlán `` index()``, athscríofa:

polls/views.py
Python
from django.shortcuts import render

from .models import Question


def index(request):
    latest_question_list = Question.objects.order_by("-pub_date")[:5]
    context = {"latest_question_list": latest_question_list}
    return render(request, "polls/index.html", context)

Tabhair faoi deara nuair a bheidh sé seo déanta againn go léir, ní gá dúinn loader agus HttpResponse a allmhairiú a thuilleadh (beidh tú ag iarraidh `` a choinneáil HttpResponse` má tá na modhanna stub fós agat maidir le sonraí, torthaí, agus vóta).

The render() function takes the request object as its first argument, a template name as its second argument and a dictionary as its optional third argument. It returns an HttpResponse object of the given template rendered with the given context.

Earráid 404 a ardúLink to this heading

Anois, déanaimis dul i ngleic le mionsonraí na ceiste - an leathanach a thaispeánann téacs na ceiste do vótaíocht ar leith. Seo an radharc:

polls/views.py
Python
from django.http import Http404
from django.shortcuts import render

from .models import Question


# ...
def detail(request, question_id):
    try:
        question = Question.objects.get(pk=question_id)
    except Question.DoesNotExist:
        raise Http404("Question does not exist")
    return render(request, "polls/detail.html", {"question": question})

An coincheap nua anseo: Ardaíonn an dearcadh an eisceacht Http404 mura bhfuil ceist leis an ID iarrtha ann.

Déanfaimid plé ar cad a d'fhéadfá a chur isteach sa teimpléad polls/detail.html sin beagán níos déanaí, ach más mian leat an sampla thuas a oibriú go tapa, comhad ina bhfuil:

polls/templates/polls/detail.html
Django template
{{ question }}

cuirfidh sé tús leat faoi láthair.

Aicearra: :func: ~django.shortcuts.get_object_or_404Link to this heading

Is idiom an-choitianta é get() a úsáid agus ardaigh Http404 mura bhfuil an réad ann. Soláthraíonn Django aicearra. Seo an radharc detail(), athscríofa:

polls/views.py
Python
from django.shortcuts import get_object_or_404, render

from .models import Question


# ...
def detail(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    return render(request, "polls/detail.html", {"question": question})

Glacann an fheidhm get_object_or_404() múnla Django mar a chéad argóint agus líon treallach argóintí eochairfhocail, a théann sé chuig an Http404() mura bhfuil an réad ann.

Tá feidhm get_list_or_404() ann freisin, a oibríonn díreach mar get_object_or_404() -- ach amháin ag baint úsáide as scagaire() in ionad get(). Ardaíonn sé Http404 má tá an liosta folamh.

Bain úsáid as an gcóras teimpléidLink to this heading

Ar ais go dtí an radharc detail() dár n-iarratas vótaíochta. Ag cur san áireamh an athróg comhthéacs ceist, seo an chuma a d'fhéadfadh a bheith ar an teimpléad vótaíocht/detail.html:

polls/templates/polls/detail.html
Django template
<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
    <li>{{ choice.choice_text }}</li>
{% endfor %}
</ul>

Úsáideann an córas teimpléad comhréir ponc-lookup chun rochtain a fháil ar airíonna athraitheacha. Sa sampla de {{ question.question_text }}, ar dtús déanann Django cuardach foclóir ar an oibiacht ceist. Dá éagmais sin, déanann sé cuardach ar tréith -- a oibríonn, sa chás seo. Dá mba theip ar chuardach aitreabúide, bhainfeadh sé triail as cuardach liosta-innéacs.

Tarlaíonn modh-ghlao sa {% le haghaidh %} lúb: léirmhínítear question.choice_set.all mar chód Python question.choice_set.all(), a fhilleann iterable de Choice réada agus atá oiriúnach le húsáid sa chlib {% le haghaidh %}.

Féach an treoir teimpléid le haghaidh tuilleadh faisnéise faoi theimpléid.

URLanna códaithe crua a bhaint i dteimpléidLink to this heading

Cuimhnigh, nuair a scríobhamar an nasc chuig ceist sa teimpléad polls/index.html, bhí cuid de chóid chrua ar an nasc mar seo:

Django template
<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>

Is í an fhadhb atá leis an gcur chuige crua-chódáilte seo atá nasctha go docht ná go n-éiríonn sé dúshlánach URLanna a athrú ar thionscadail le go leor teimpléid. Mar sin féin, ós rud é gur shainigh tú an argóint name i bhfeidhmeanna path() sa mhodúl polls.urls, is féidir leat brath ar chonairí URL ar leith atá sainithe i do url a bhaint cumraíochtaí trí úsáid a bhaint as an gclib teimpléad { %url %}:

Django template
<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>

Is é an chaoi a n-oibríonn sé seo ná breathnú ar an sainmhíniú URL mar atá sonraithe sa mhodúl polls.urls. Is féidir leat a fheiceáil go díreach cá bhfuil an t-ainm URL 'mionsonraí' sainmhínithe thíos:

Code
...
# the 'name' value as called by the {% url %} template tag
path("<int:question_id>/", views.detail, name="detail"),
...

Más mian leat URL mionamharc na vótaíochta a athrú go rud éigin eile, b'fhéidir go rud éigin ar nós vótaíocht/sonraí/12/ seachas é a dhéanamh sa teimpléad (nó teimpléid) d'athródh tú é i `` pobalbhreith / urls.py``:

Code
...
# added the word 'specifics'
path("specifics/<int:question_id>/", views.detail, name="detail"),
...

Ainmneacha URL spásálaLink to this heading

Níl ach aip amháin ag an tionscadal teagaisc, `` pobalbhreith``. I dtionscadail fíor Django, d'fhéadfadh go mbeadh cúig, deich, fiche apps nó níos mó. Conas a dhéanann Django idirdhealú a dhéanamh idir na hainmneacha URL eatarthu? Mar shampla, tá radharc mionsonraí ag an aip vótaíochta, agus mar sin d'fhéadfadh aip ar an tionscadal céanna atá le haghaidh blag. Cén chaoi a mbeidh a fhios ag Django cén t-aip atá le cruthú le haghaidh url agus an chlib teimpléid ``{ % url %}` in úsáid agat?

Is é an freagra ná spásanna ainm a chur le do URLconf. Sa chomhad vótaíocht/urls.py, téigh ar aghaidh agus cuir ainm_app leis chun ainmspás an fheidhmchláir a shocrú:

polls/urls.py
Python
from django.urls import path

from . import views

app_name = "polls"
urlpatterns = [
    path("", views.index, name="index"),
    path("<int:question_id>/", views.detail, name="detail"),
    path("<int:question_id>/results/", views.results, name="results"),
    path("<int:question_id>/vote/", views.vote, name="vote"),
]

Anois athraigh do theimpléad vótaíocht/index.html ó:

polls/templates/polls/index.html
Django template
<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>

chun pointe a chur ar an radharc ainmspásáilte:

polls/templates/polls/index.html
Django template
<li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>

Agus tú ar do chompord ag scríobh tuairimí, léigh cuid 4 den rang teagaisc seo chun na bunghnéithe a fhoghlaim maidir le próiseáil foirmeacha agus tuairimí cineálacha.