Opi rakentamaan tehtävänhallintasovellus hyödyntäen CRUD-periaatteita ja luokkapohjaisia ​​näkymiä Djangossa.

Yksi Djangon tärkeimmistä ominaisuuksista on sen sisäänrakennettu tuki projektien luomiseen CRUD-toimintojen (Create, Read, Update, Delete) päälle. Vaikka Djangon luokkapohjaiset näkymät tarjoavat nopean, helpon ja joustavan tavan luoda verkkosovelluksia, monet kehittäjät käyttävät edelleen toimintopohjaisia ​​näkymiä.

Luokkapohjaiset näkymät tarjoavat useita etuja funktiopohjaisiin näkymiin verrattuna, mukaan lukien periytyminen, koodin strukturointi, koodin uudelleenkäytettävyys ja paljon muuta. Vaikka luokkapohjaisten näkymien käyttöönotto saattaa tuntua hieman monimutkaiselta, tämä opas auttaa sinua ymmärtämään konseptin rakentamalla tehtävänhallintasovelluksen ja tarjoamalla vaiheittaiset ohjeet.

Mitä ovat luokkakohtaiset näkymät Djangossa?

Djangossa näkymät ovat Python-funktiot jotka vastaanottavat verkkopyynnön ja palauttavat verkkovastauksen. Luokkapohjaiset näkymät (CBV) ovat vaihtoehtoinen tapa määrittää näkymiä Djangossa käyttämällä Python-luokkia funktioiden sijaan.

CBV: llä on useita etuja, kuten parempi koodin organisointi, helpompi koodin uudelleenkäyttö ja kyky käyttää periytymistä luomaan muunnelmia olemassa olevista näkymistä. CBV: t tarjoavat myös sisäänrakennettuja menetelmiä, kuten saada() ja lähettää() menetelmiä, jotka voit korvata mukautetuille käytöksille.

Tässä artikkelissa käytetty koodi on saatavilla tässä GitHub-arkisto.

Luokkapohjaiset näkymät saatavilla Djangossa

Django tarjoaa joitain sisäänrakennettuja CBV: itä suosittuihin käyttötapauksiin, kuten objektiluetteloiden näyttämiseen tai uusien luomiseen. Jotkut näistä sisäänrakennetuista CBV: istä ovat:

  1. Listanäkymä: Tämä näkymä näyttää luettelon mallista haetuista objekteista. Esimerkiksi sivu, jossa luetellaan kaikki blogissa saatavilla olevat viestit, käyttää a Listanäkymä.
  2. DetailView: Tämä näkymä näyttää yksityiskohtaisen näkymän yhdestä mallista haetuista objekteista. Voit käyttää a DetailView näyttääksesi tiettyjen viestien tiedot blogisovelluksessa.
  3. CreateView: Tämä näkymä luo lomakkeen uuden objektin luomiseksi ja käsittelee lomakkeen lähetyksen. Esimerkiksi tehtävänhallintasovelluksessa käytät tätä näkymää uusien tehtävien luomiseen.
  4. PoistaView: Tämä näkymä näyttää vahvistussivun objektin poistamisesta ja käsittelee sivun poistamisen.
  5. UpdateView: Tämä näkymä luo lomakkeen olemassa olevan objektin päivittämiseksi ja käsittelee lomakkeen lähettämisen.

Django tarjoaa myös muita näkymiä, mukaan lukien Mallinäkymä, RedirectView, ja FormView. Voit viitata Djangon dokumentaatio saadaksesi yksityiskohtaista tietoa luokkakohtaisista näkymistä.

Rakenna Task Manager -sovellus Django-luokkapohjaisilla näkymillä

Sovelluksen, kuten tehtävänhallintasovelluksen, luominen auttaa sinua ymmärtämään, kuinka CRUD-toimintoja voidaan toteuttaa CBV: n kanssa. Tehtävienhallinnassa on ominaisuuksia, joiden avulla käyttäjät voivat luoda, päivittää, poistaa ja lukea tehtäviä. Nämä ominaisuudet ovat linjassa CRUD-toimintojen kanssa. Seuraavat vaiheet auttavat sinua rakentamaan tehtävänhallintasovelluksen Django CBV: illä.

Perusta Django-projekti

Voit luoda tehtävänhallintasovelluksen Djangon kanssa aloittamalla seuraavasti:

  1. Asenna Django omaan Python-virtuaaliympäristö tällä komennolla:
    pip asennus django
  2. Luo Django-projekti. Seuraava komento luo projektin nimeltä projektin_ydin.
    django-admin aloitusprojektin_ydin .
  3. Luo sovellus nimeltä tehtävänhallinta.
    python manage.py startapp task_manager
  4. Sinun settings.py lisää sovelluksesi nimi kohtaan INSTALLED_APPS lista.
    INSTALLED_APPS = [
    'task_manager',
    ]
  5. Avaa urls.py tiedosto projektihakemistoosi ja määritä URL-osoitteet tehtävänhallinta sovellus:
    alkaen django.urls tuonti polku, sisältää

    urlpatterns = [
    polku ('', sisältää('task_manager.urls')),
    ]

Luo malli Task Manager -sovelluksellesi

Sovellushakemistossasi (tai tehtävänhallinta kansio), avaa omasi mallit.py tiedosto ja luo malli tehtävänhallintasovelluksellesi. Tässä on esimerkkimalli, jota voit käyttää:

alkaen django.db tuonti mallit

luokkaaTehtävä(mallit. Malli):
otsikko = mallit. CharField (max_length=200)
kuvaus = mallit. Tekstikenttä()
valmis = mallit. BooleanField (oletus =Väärä)
Created_at = mallit. DateTimeField (auto_now_add=Totta)

Siirrä mallisi tällä komennolla:

python manage.py makemigrations && python manage.py migrate

Luo sovelluksellesi Django-lomake

Sinulla pitäisi olla lomake käsittelyä varten Luoda ja Päivittää toiminnot. Luo sovellushakemistoosi tiedosto nimeltä forms.py. Tässä on esimerkki:

alkaen django tuonti lomakkeita
alkaen .malleja tuonti Tehtävä

luokkaaTehtävälomake(lomakkeet. Mallilomake):
luokkaaMeta:
malli = Tehtävä
kentät = ['titteli', 'kuvaus', 'valmis']

widgetit = {
'titteli': lomakkeet. Tekstinsyöttö (attrs={"luokka": 'form-control',}),
'kuvaus': lomakkeet. Tekstialue (attrs={"luokka": 'form-control',}),
'valmis': lomakkeet. CheckboxInput (attrs={"luokka": 'lomake-check-input'}),
}

Yllä olevassa koodissa on luokka nimeltä Tehtävälomake joka määrittää lomakkeen kentät ja widgetit. Se määrittää myös käytettävän mallin.

Luo Django-näkymät jokaiselle CRUD-operaatiolle

CBV: llä varustettu CRUD-perussovellus vaatii vähintään neljä näkymää kaikkien toimintojen tehokkaaseen käsittelyyn. Muutama seuraava vaihe näyttää, kuinka ne luodaan.

Tuo tarvittavat moduulit ja paketit

Avaa sinun views.py tiedosto ja tee seuraavat tuonnit:

alkaen django.views.generic tuonti ListView, DetailView, CreateView, UpdateView, DeleteView
alkaen django.urls tuonti käänteinen_laiska
alkaen .malleja tuonti Tehtävä
alkaen .lomakkeet tuonti Tehtävälomake

Yllä oleva koodi tuo viisi CBV: tä. Se myös tuo maahan käänteinen_laiska ohjata käyttäjän määritettyyn URL-osoitteeseen lomakkeen lähettämisen jälkeen. Lopuksi se tuo maahan Tehtävä malli ja Tehtävälomake luotu aiemmin.

Luo näkymä mallineobjektien luetteloimiseksi

Tehtävienhallintasovelluksessa tulisi olla sivu, jossa luetellaan kaikki käyttäjän luomat tehtävät. Voit luoda näkymän tätä varten käyttämällä Listanäkymä. Tässä on esimerkki:

luokkaaTaskListView(Listanäkymä):
malli = Tehtävä
mallin_nimi = 'task_manager/task_list.html'
konteksti_objektin_nimi = 'tehtävät'

Yllä oleva näkymä määrittelee kolme attribuuttia, jotka ovat:

  1. malli: Tämä määrite määrittää, mitä mallia kyseisessä näkymässä käytetään.
  2. mallin_nimi: Tämä attribuutti kertoo Djangolle, mikä malli hahmonnetaan selaimelle.
  3. konteksti_objektin_nimi: Tämä attribuutti määrittää nimen, joka antaa mallille pääsyn mallin objektiluetteloon.

Useimmat CBV: t sisältävät nämä kolme attribuuttia.

Luo näkymä tehtävän yksityiskohtien käsittelemiseksi

Jokaisella käyttäjän luomalla tehtävällä tulee olla sivu, joka näyttää sen tiedot. Ihanteellinen CBV tämän hoitamiseen on DetailView. Tässä on yksinkertainen esimerkki:

luokkaaTaskDetailView(DetailView):
malli = Tehtävä
mallin_nimi = 'task_manager/task_detail.html'

Luo näkymä tehtävien luomista varten

Luo näkymä uusien tehtävien luomista tai lisäämistä varten. Tämä on Luoda osa CRUD-toimintoja, ja oikea näkymä tähän on CreateView. Käytä sitä seuraavasti:

luokkaaTaskCreateView(Luo näkymä):
malli = Tehtävä
form_class = Tehtävälomake
mallin_nimi = 'task_manager/task_form.html'
menestys_url = reverse_lazy('tehtävälista')

Yllä oleva koodi tuo kaksi uutta attribuuttia: muoto_luokka ja menestys_url.

The muoto_luokka attribuutti kertoo näkymät, mikä lomakeluokka renderöidä ja käyttää sen toimintoihin.

The menestys_url määrittää, kuinka käyttäjä ohjataan uudelleen lomakkeen lähettämisen jälkeen. Se käyttää käänteinen_laiska funktio, joka ottaa URL-polun nimen.

Luo näkymä tehtävien muokkausta varten

Jotta käyttäjäsi voivat muokata tai päivittää tehtäviään, sinun tulee luoda näkymä, joka näyttää tältä:

luokkaaTaskUpdateView(UpdateView):
malli = Tehtävä
form_class = Tehtävälomake
mallin_nimi = 'task_manager/task_form.html'
menestys_url = reverse_lazy('tehtävälista')

Yllä oleva näkymä on samanlainen kuin TaskCreateView luotu aiemmin. Ainoa ero on käyttö UpdateView.

Luo näkymä poistotoimintojen käsittelemiseksi

Jotta käyttäjät voivat poistaa tehtäviä milloin tahansa, sinun tulee käyttää PoistaView CBV. Tässä on esimerkki:

luokkaaTaskDeleteView(Poista View):
malli = Tehtävä
mallin_nimi = 'task_manager/task_confirm_delete.html'
menestys_url = reverse_lazy('tehtävälista')

Määritä sovelluksesi URL-osoitteet

Luo sovellushakemistoosi a urls.py tiedosto ja määritä URL-mallisi seuraavasti:

alkaen django.urls tuonti polku
alkaen .views tuonti TaskListView, TaskDetailView, TaskCreateView, TaskUpdateView, TaskDeleteView

urlpatterns =
polku ('', TaskListView.as_view(), nimi='tehtävälista'),
polku ('luoda/', TaskCreateView.as_view(), nimi='task_create'),
polku ('tehtävät//', TaskDetailView.as_view(), nimi='task_detail'),
polku ('tehtävät//update/', TaskUpdateView.as_view(), nimi='task_update'),
polku ('tehtävät//delete/', TaskDeleteView.as_view(), nimi='task_delete'),
]

Yllä olevat URL-osoitemallit ovat samanlaisia ​​kuin funktiopohjaisilla näkymillä luodut URL-osoitteet. Erona on as_view() funktio liitetään jokaisen näkymän nimen loppuun.

Sinä pystyt käytä Django-etanoita URL-osoitteiden luomiseen yllä käytetyn ensisijaisen avaimen sijaan.

Luo malleja näkymillesi

Jos sallit käyttäjien suorittaa yllä olevissa näkymissä määritettyjä toimintoja, sinun on tarjottava heille käyttöliittymä, jonka kanssa he voivat olla vuorovaikutuksessa. Aiemmin luoduista näkymistä tehtävienhallintasovelluksessa tulisi olla neljä käyttöliittymää.

Luo sovellushakemistoosi neljä HTML-mallia. Sinun pitäisi myös luoda base.html tiedosto. Sinä pystyt muotoile Django-mallejasi Bootstrapilla ajan säästämiseksi.

Tehtäväluettelomalli

Tämän mallin tulee sisältää koodi, joka luettelee kaikki mallin tehtävät. Esimerkki koodista on tämä:

{% extends 'base.html' %}

{% block content %}
<keskusta>
<h1>Sinun tehtäväsih1>
<ahref="{% url 'task_create' %}">Lisää tehtäväa>
{% tehtävästä tehtävissä %}
<div>
<div>
<h5>{{ task.title }}h5>
<s>{{ task.description|truncatechars: 50 }}s>
<s>
<vahva>Valmistunut:vahva>
{% if task.completed %}Kyllä{% else %}Ei{% endif %}
s>
<ahref="{% url 'task_detail' task.pk %}">
Lue lisää
a>
<ahref="{% url 'task_delete' task.pk %}">
Poista tehtävä
a>
div>
div>
{% tyhjä %}
<h3>Ei vielä tehtäviä.h3>
<ahref="{% url 'task_create' %}">Lisää tehtäväa>
{% endfor %}
keskusta>
{% endblock %}

Joidenkin Bootstrap-luokkien avulla voit saada sivusi näyttämään tältä:

Tehtävän tietomalli

Tällä sivulla pitäisi näkyä jokaisen luodun tehtävän täydelliset tiedot. Tässä on esimerkkimalli, jota voit käyttää:

{% extends 'base.html' %}

{% block content %}
<h1>{{ task.title }}h1>
<s>{{ tehtävän kuvaus }}s>
<s>Valmis: {% if task.completed %}Kyllä{% else %}Ei{% endif %}s>
<ahref="{% url 'task_update' task.pk %}">Muokkaa tehtävääa>
<ahref="{% url 'task_delete' task.pk %}">Poista tehtäväa>
{% endblock %}

Tyylistäsi riippuen sivusi pitäisi näyttää tältä:

Tehtävälomakemalli

Tämän mallin tulee sisältää lomake, jonka avulla käyttäjä voi luoda tai päivittää tehtävän.

{% extends 'base.html' %}

{% block content %}
<h1>Luo tehtäväh1>
<muodossamenetelmä="lähettää">
{% csrf_token %}
{{ form.as_p }}
<-painikettatyyppi="Lähetä">Tallentaa-painiketta>
muodossa>
{% endblock %}

Malli näyttää tältä:

Poista tehtävämalli

Tämän mallin tulee olla vahvistussivu tehtävien tahattoman poistamisen estämiseksi.

{% extends 'base.html' %}

{% block content %}
<h1>Vahvista poistaminenh1>
<s>Haluatko varmasti poistaa kohteen "{{ object.title }}"?s>
<muodossamenetelmä="lähettää">
{% csrf_token %}
<-painikettatyyppi="Lähetä">Poistaa-painiketta>
<ahref="{% url 'task_list' %}">Peruuttaaa>
muodossa>
{% endblock %}

Jollakin Bootstrapilla sivusi pitäisi näyttää tältä:

Käytä luokkakohtaisia ​​näkymiä tuottavuuden lisäämiseen

Luokkapohjaiset näkymät ovat loistava tapa kirjoittaa puhdasta, järjestettyä koodia lyhyessä ajassa, mikä lisää tuottavuuttasi. Sinun tulee käyttää niitä projekteissasi niin paljon kuin mahdollista. Voit myös integroida edelleen ominaisuuksia, kuten hakutoimintoja, ilmoituksia ja niin edelleen, jotta tehtävänhallintasovelluksesta tulee täysin toimiva sovellus.