---
title: "Do chéad aip Django a scríobh, cuid 3"
version: 6.1
locale: ga
source: https://docs.djangoproject.com/ga/6.1/intro/tutorial03/
canonical: https://djangodocs.dev/ga/6.1/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/6.1/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/6.1/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/6.1/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/6.1/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/6.1/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/6.1/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
```

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

### Aicearra: [`render()`](/ga/6.1/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/6.1/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/6.1/topics/templates/#module-django.template.loader) agus [`HttpResponse`](/ga/6.1/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/6.1/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/6.1/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/6.1/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/6.1/ref/models/querysets/#django.db.models.query.QuerySet.get) a úsáid agus ardaigh [`Http404`](/ga/6.1/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/6.1/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/6.1/topics/http/shortcuts/#django.shortcuts.get_object_or_404) in ionad na heisceachtaí [`ObjectDoesNotExist`](/ga/6.1/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/6.1/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/6.1/topics/http/shortcuts/#module-django.shortcuts).

Tá feidhm [`get_list_or_404()`](/ga/6.1/topics/http/shortcuts/#django.shortcuts.get_list_or_404) ann freisin, a oibríonn díreach mar [`get_object_or_404()`](/ga/6.1/topics/http/shortcuts/#django.shortcuts.get_object_or_404) -- ach amháin ag baint úsáide as ` scagaire()` in ionad [`get()`](/ga/6.1/ref/models/querysets/#django.db.models.query.QuerySet.get). Ardaíonn sé [`Http404`](/ga/6.1/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/6.1/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/6.1/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/6.1/intro/tutorial04/) chun na bunghnéithe a fhoghlaim maidir le próiseáil foirmeacha agus tuairimí cineálacha.
