---
title: "Do chéad aip Django a scríobh, cuid 3"
version: 5.2
locale: ga
source: https://docs.djangoproject.com/ga/5.2/intro/tutorial03/
canonical: https://djangodocs.dev/ga/5.2/intro/tutorial03/
---
# Do chéad aip Django a scríobh, cuid 3

Tosaíonn an rang teagaisc seo nuair a d'fhág [Tutorial 2](/ga/5.2/intro/tutorial02/) 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í."

> **Cá háit le cabhair a fháil:**
>
> Má tá deacracht agat dul tríd an rang teagaisc seo, téigh ar aghaidh chuig an rannán :d oc:'Getting Help\</faq/help\>' den rannán Ceisteanna Coitianta.

## Forbhreathnú

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](/ga/5.2/topics/http/urls/) le haghaidh tuilleadh eolais.

## Tuilleadh tuairimí á scríobh

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`](/ga/5.2/ref/settings/#std-setting-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:

```pycon
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íre

Tá gach amharc freagrach as ceann amháin de dhá rud a dhéanamh: réad [`HttpResponse`](/ga/5.2/ref/request-response/#django.http.HttpResponse) a thabhairt ar ais ina bhfuil an t-ábhar don leathanach iarrtha, nó eisceacht a ardú mar [`Http404`](/ga/5.2/topics/http/views/#django.http.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á . 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](/ga/5.2/intro/tutorial02/). 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
```

Tá fadhb anseo, áfach: tá cód crua ar dhearadh an leathanaigh san amharc. Más mian leat an cuma ar an leathanach a athrú, beidh ort an cód Python seo a chur in eagar. Mar sin, bainimis úsáid as córas teimpléid Django chun an dearadh a scaradh ó Python trí theimpléad a chruthú ar féidir leis an radharc a úsáid.

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

Déanann socrú  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`](/ga/5.2/ref/settings/#std-setting-TEMPLATES-APP_DIRS) socraithe go `True`. De réir an ghnáis lorgaíonn `DjangoTemplates` fochomhadlann "teimpléid" i ngach ceann de na .

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 .

> **Spásáil ainm teimpléad**
>
> Anois \* b'fhéidir go mbeimid in ann fáil amach lenár dteimpléid a chur go díreach i \`\` pobalbhreith / teimpléid \`\` (seachas fochomhadlann \`\` pobalbhreith \`\` eile a chruthú), ach is droch-smaoineamh a bheadh ​​ann i ndáiríre. Roghnóidh Django an chéad teimpléad a aimsíonn sé a bhfuil a ainm ag teacht leis, agus dá mbeadh teimpléad leis an ainm céanna agat in iarratas *difriúil*, ní bheadh ​​Django in ann idirdhealú a dhéanamh eatarthu. Ní mór dúinn a bheith in ann Django a dhíriú ar an gceann ceart, agus is é an bealach is fearr lena chinntiú ná *spásáil \* orthu. Is é sin, trí na teimpléid sin a chur san eolaire \* eile* atá ainmnithe don fheidhmchlár féin.

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

*`polls/templates/polls/index.html`*

```html+django
{% 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 %}
```

> **Note**
>
> Chun an rang teagaisc a dhéanamh níos giorra, úsáideann gach sampla teimpléid HTML neamhiomlán. I do thionscadail féin ba chóir duit [doiciméid HTML iomlána](https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/Getting_started#anatomy_of_an_html_document) a úsáid.

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](/ga/5.2/intro/tutorial02/). Léiríonn an nasc leathanach sonraí na ceiste.

### Aicearra: [`render()`](/ga/5.2/topics/http/shortcuts/#django.shortcuts.render)

Is idiom an-choitianta é teimpléad a lódáil, comhthéacs a líonadh agus réad [`HttpResponse`](/ga/5.2/ref/request-response/#django.http.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`](/ga/5.2/topics/templates/#module-django.template.loader) agus [`HttpResponse`](/ga/5.2/ref/request-response/#django.http.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()`](/ga/5.2/topics/http/shortcuts/#django.shortcuts.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`](/ga/5.2/ref/request-response/#django.http.HttpResponse)
object of the given template rendered with the given context.

## Earráid 404 a ardú

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`](/ga/5.2/topics/http/views/#django.http.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`*

```html+django
{{ question }}
```

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

### Aicearra: :func: ~django.shortcuts.get\_object\_or\_404

Is idiom an-choitianta é [`get()`](/ga/5.2/ref/models/querysets/#django.db.models.query.QuerySet.get) a úsáid agus ardaigh [`Http404`](/ga/5.2/topics/http/views/#django.http.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()`](/ga/5.2/topics/http/shortcuts/#django.shortcuts.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.

> **Fealsúnacht**
>
> Cén fáth a n-úsáidimid feidhm chúntóra [`get_object_or_404()`](/ga/5.2/topics/http/shortcuts/#django.shortcuts.get_object_or_404) in ionad na heisceachtaí [`ObjectDoesNotExist`](/ga/5.2/ref/exceptions/#django.core.exceptions.ObjectDoesNotExist) a ghlacadh go huathoibríoch ag leibhéal níos airde, nó an tsamhail API a ardú :exc :~django.http.Http404 in ionad [`ObjectDoesNotExist`](/ga/5.2/ref/exceptions/#django.core.exceptions.ObjectDoesNotExist)?
>
> Toisc go gceanglódh sé sin an ciseal samhail leis an gciseal radhairc. Is é ceann de na príomhspriocanna deartha atá ag Django ná cúpláil scaoilte a choinneáil. Tugtar roinnt cúplála rialaithe isteach sa mhodúl [`django.shortcuts`](/ga/5.2/topics/http/shortcuts/#module-django.shortcuts).

Tá feidhm [`get_list_or_404()`](/ga/5.2/topics/http/shortcuts/#django.shortcuts.get_list_or_404) ann freisin, a oibríonn díreach mar [`get_object_or_404()`](/ga/5.2/topics/http/shortcuts/#django.shortcuts.get_object_or_404) -- ach amháin ag baint úsáide as ` scagaire()` in ionad [`get()`](/ga/5.2/ref/models/querysets/#django.db.models.query.QuerySet.get). Ardaíonn sé [`Http404`](/ga/5.2/topics/http/views/#django.http.Http404) má tá an liosta folamh.

## Bain úsáid as an gcóras teimpléid

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`*

```html+django
<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](/ga/5.2/topics/templates/) le haghaidh tuilleadh faisnéise faoi theimpléid.

## URLanna códaithe crua a bhaint i dteimpléid

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:

```html+django
<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()`](/ga/5.2/ref/urls/#django.urls.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 %}`:

```html+django
<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:

```
...
# 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\`\`:

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

## Ainmneacha URL spásála

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`*

```html+django
<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`*

```html+django
<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](/ga/5.2/intro/tutorial04/) chun na bunghnéithe a fhoghlaim maidir le próiseáil foirmeacha agus tuairimí cineálacha.
