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

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

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

## Scríobh foirm íosta

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

```html+django
<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 é `luach` gach cnaipe raidió ná ID an rogha ceiste gaolmhar. Is é `ainm` gach 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íomh` na foirme go `{%url' vótaíocht:vóta' question.id %}`, agus leagamar síos `modh="post"`. Tá sé an-tábhachtach úsáid a bhaint as `modh="post"` (seachas `modh="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.counter` cá mhéad uair a chuaigh an chlib [`for`](/ga/6.0/ref/templates/builtins/#std-templatetag-for) trí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 %}`](/ga/6.0/ref/templates/builtins/#std-templatetag-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](/ga/6.0/intro/tutorial03/), chruthaigh muid URLconf don fheidhmchlár vótaíochta a chuimsíonn an líne seo:

*`polls/urls.py`*

```python
path("<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.py`*

```python
from 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.POST`](/ga/6.0/ref/request-response/#django.http.HttpRequest.POST) is 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, cuireann `iarratas.POST['rogha']` ID na rogha roghnaithe ar ais, mar theaghrán. [`request.POST`](/ga/6.0/ref/request-response/#django.http.HttpRequest.POST) is teaghráin i gcónaí iad na luachanna.

  Tabhair faoi deara go soláthraíonn Django freisin [`request.GET`](/ga/6.0/ref/request-response/#django.http.HttpRequest.GET) chun sonraí GET a rochtain ar an mbealach céanna -- ach táimid ag baint úsáide as `request.POST` inár gcód, chun a chinntiú nach n-athraítear sonraí ach trí ghlao POST.
- Ardóidh `iarratas.POST['rogha']` `Earráid Eochair` murar soláthraíodh `rogha` i sonraí POST. Seiceálann an cód thuas le haghaidh [`KeyError`](https://docs.python.org/3/library/exceptions.html#KeyError) agus ath-thaispeánann sé an fhoirm cheiste le teachtaireacht earráide mura dtugtar `rogha`.
- 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  seachas gnáth:rang:~django.http.HttpResponse. [`HttpResponseRedirect`](/ga/6.0/ref/request-response/#django.http.HttpResponseRedirect) a 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 [`HttpResponseRedirect`](/ga/6.0/ref/request-response/#django.http.HttpResponseRedirect) a 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()`](/ga/6.0/ref/urlresolvers/#django.urls.reverse) sa chruthaitheoir [`HttpResponseRedirect`](/ga/6.0/ref/request-response/#django.http.HttpResponseRedirect) sa 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](/ga/6.0/intro/tutorial03/), seo [`reverse()`](/ga/6.0/ref/urlresolvers/#django.urls.reverse) cuirfidh an glaoch seo ar ais teaghrán mar

  ```
  "/polls/3/results/"
  ```

  áit a bhfuil an `3` luach `cheist.id`. Glaofaidh an URL atreoraithe seo ar an radharc `'torthaí'` chun an leathanach deiridh a thaispeáint.

Mar a luadh in [Teagasc 3](/ga/6.0/intro/tutorial03/), is  é `iarratas`. Le haghaidh tuilleadh eolais ar [`HttpRequest`](/ga/6.0/ref/request-response/#django.http.HttpRequest) réada, féach ar an [doiciméadú iarratais agus freagartha](/ga/6.0/ref/request-response/).

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

```python
from 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](/ga/6.0/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í.

Anois, cruthaigh teimpléad `polls/results.htmll`:

*`polls/templates/polls/results.html`*

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

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  agus [`DetailView`](/ga/6.0/ref/class-based-views/generic-display/#django.views.generic.detail.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:

1. Tiontaigh URLconf.
2. Scrios cuid de na seanamharcanna nach bhfuil ag teastáil.
3. Tabhair isteach tuairimí nua bunaithe ar thuairimí cineálacha Django.

Léigh ar aghaidh le haghaidh sonraí.

> **Cén fáth an cód-shuffle?**
>
> Go ginearálta, agus aip Django á scríobh agat, déanfaidh tú meastóireacht ar cé acu an n-oireann tuairimí cineálacha go maith do d’fhadhb, agus úsáidfidh tú iad ón tús, seachas do chód a athmhacrú leath bealaigh tríd. Ach dhírigh an teagasc seo go hintinneach ar na tuairimí "an bealach crua" a scríobh go dtí seo, chun díriú ar chroí-choincheapa.
>
> Ba chóir go mbeadh a fhios agat matamaitic bhunúsach sula dtosaíonn tú ag úsáid áireamhán.

### Leasaigh URLconf

Ar dtús, oscail an URLconf \`\` polls/urls.py\`\` agus athraigh é mar sin:

*`polls/urls.py`*

```python
from 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`](/ga/6.0/ref/class-based-views/generic-display/#django.views.generic.detail.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 radharcanna

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

```python
from 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`](/ga/6.0/ref/class-based-views/generic-display/#django.views.generic.detail.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`](/ga/6.0/ref/class-based-views/generic-display/#django.views.generic.list.ListView) teimpléad réamhshocraithe ar a dtugtar \`\` \<ainm an fheidhmchláir\>/\<ainm samhail\>\_list.html\`\`; úsáidimid `template_name` chun [`ListView`](/ga/6.0/ref/class-based-views/generic-display/#django.views.generic.list.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](/ga/6.0/topics/class-based-views/).

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.
