Kattava opas Django-luokkapohjaisten geneeristen näkymien räätälöintiin tehokkaassa verkkokehityksessä. Opi muokkaamaan näkymiä juuri omiin tarpeisiisi.
Django-luokkapohjaiset näkymät: Geneeristen näkymien räätälöinnin hallinta
Djangon luokkapohjaiset näkymät (CBV:t) tarjoavat tehokkaan ja uudelleenkäytettävän tavan rakentaa verkkosovelluksia. Geneeriset näkymät, jotka ovat CBV:iden alajoukko, tarjoavat valmiita ratkaisuja yleisiin tehtäviin, kuten listojen, yksityiskohtaisten näkymien näyttämiseen sekä objektien luomiseen, päivittämiseen ja poistamiseen. Vaikka nämä geneeriset näkymät ovat uskomattoman käteviä, ne vaativat usein räätälöintiä sovelluksen erityistarpeisiin sopivaksi. Tämä kattava opas tutustuttaa sinut Djangon geneeristen näkymien räätälöinnin eri tekniikoihin, mikä antaa sinulle valmiudet rakentaa tehokkaita ja ylläpidettäviä verkkosovelluksia.
Djangon luokkapohjaisten näkymien ymmärtäminen
Ennen kuin syvennymme räätälöintiin, kerrataanpa CBV:iden ja geneeristen näkymien perusteet. Perinteiset funktiopohjaiset näkymät (FBV:t) käsittelevät HTTP-pyyntöjä suoraan yhden funktion sisällä. CBV:t sen sijaan organisoivat näkymälogiikan luokkiin, tarjoten jäsennellymmän ja oliopohjaisemman lähestymistavan. Tämä johtaa parempaan koodin organisointiin, uudelleenkäytettävyyteen ja testattavuuteen.
Geneeriset näkymät ovat valmiiksi rakennettuja CBV:itä, jotka on suunniteltu käsittelemään yleisiä verkkokehitystehtäviä. Ne perivät ominaisuuksia perusluokista, kuten View
ja TemplateView
, ja tarjoavat erikoistuneita toiminnallisuuksia. Yleisiä geneerisiä näkymiä ovat:
ListView
: Näyttää listan objekteista.DetailView
: Näyttää yksittäisen objektin tiedot.CreateView
: Käsittelee objektin luomisen lomakkeen avulla.UpdateView
: Käsittelee objektin päivittämisen lomakkeen avulla.DeleteView
: Käsittelee objektin poistamisen.
Nämä geneeriset näkymät tarjoavat vankan perustan, mutta todelliset sovellukset vaativat usein niiden toiminnan räätälöintiä. Tarkastellaanpa erilaisia räätälöintitekniikoita.
Räätälöintitekniikat
Djangon geneeristen näkymien räätälöintiin on useita tapoja, jotka vaihtelevat yksinkertaisista attribuuttien yliajomisista monimutkaisempiin metodien yliajomisiin. Sopiva tekniikka riippuu tarvittavasta räätälöinnin tasosta.
1. Attribuutin yliajaminen
Yksinkertaisin räätälöintimuoto sisältää geneerisen näkymäluokan attribuuttien yliajomisen. Tämä on ihanteellinen perustietojen, kuten mallin, mallipohjan nimen tai kontekstiobjektin nimen, muokkaamiseen.
Esimerkki: ListView
:n räätälöinti
Oletetaan, että haluat näyttää listan artikkeleista, mutta haluat käyttää mukautettua mallipohjaa ja erilaista kontekstiobjektin nimeä.
from django.views.generic import ListView
from .models import Article
class ArticleListView(ListView):
model = Article
template_name = 'articles/article_list.html'
context_object_name = 'articles'
def get_queryset(self):
return Article.objects.filter(is_published=True).order_by('-publication_date')
Tässä esimerkissä olemme yliajaneet model
-, template_name
- ja context_object_name
-attribuutit. Olemme myös yliajaneet get_queryset
-metodin suodattaaksemme artikkelit ja järjestääksemme ne julkaisupäivämäärän mukaan. get_queryset
-metodi antaa sinulle hallinnan siitä, mitkä objektit sisällytetään lista-näkymään. Tämä on hyödyllistä suodatuksen, järjestyksen ja sivutuksen toteuttamisessa.
2. Metodin yliajaminen
Metodin yliajaminen antaa sinun muokata olemassa olevien metodien käyttäytymistä geneerisessä näkymäluokassa. Tämä tarjoaa enemmän hallintaa näkymän logiikkaan. Yleisiä yliajettavia metodeja ovat:
get_queryset()
: Hallitsee näkymän käyttämää kyselyjoukkoa.get_context_data()
: Lisää tietoja mallipohjan kontekstiin.form_valid()
: Käsittelee onnistuneen lomakkeen lähetyksen.form_invalid()
: Käsittelee virheellisen lomakkeen lähetyksen.get_success_url()
: Määrittää URL-osoitteen, johon ohjataan onnistuneen lomakkeen lähetyksen jälkeen.get_object()
: Hakee objektin DetailView-, UpdateView- ja DeleteView-näkymiä varten
Esimerkki: DetailView
:n räätälöinti
Oletetaan, että haluat näyttää artikkelin tiedot, mutta haluat myös sisällyttää siihen liittyvät kommentit mallipohjan kontekstiin.
from django.views.generic import DetailView
from .models import Article, Comment
class ArticleDetailView(DetailView):
model = Article
template_name = 'articles/article_detail.html'
context_object_name = 'article'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['comments'] = Comment.objects.filter(article=self.object, is_approved=True)
return context
Tässä olemme yliajaneet get_context_data()
-metodin lisätäksemme comments
-muuttujan mallipohjan kontekstiin. Tämä mahdollistaa liitettyjen kommenttien helpon käytön ja näyttämisen article_detail.html
-mallipohjassa.
3. Miksinien käyttö
Miksinit ovat uudelleenkäytettäviä luokkia, jotka tarjoavat tiettyä toiminnallisuutta. Ne voidaan yhdistää geneerisiin näkymiin toimintojen lisäämiseksi muuttamatta näkymän ydinlogiikkaa. Django tarjoaa useita sisäänrakennettuja miksinejä, ja voit luoda myös omia.
Esimerkki: LoginRequiredMixin
-miksinin käyttö
LoginRequiredMixin
varmistaa, että vain sisäänkirjautuneet käyttäjät voivat käyttää tiettyä näkymää.
from django.views.generic import CreateView
from django.contrib.auth.mixins import LoginRequiredMixin
from .models import Article
from .forms import ArticleForm
class ArticleCreateView(LoginRequiredMixin, CreateView):
model = Article
form_class = ArticleForm
template_name = 'articles/article_form.html'
success_url = '/articles/' # Replace with your desired success URL
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
Tässä esimerkissä olemme käyttäneet LoginRequiredMixin
-miksinä rajoittamaan ArticleCreateView
-näkymän käytön vain sisäänkirjautuneille käyttäjille. Olemme myös yliajaneet form_valid
-metodin asettaaksemme artikkelin kirjoittajaksi automaattisesti nykyisen käyttäjän. Tämä osoittaa, kuinka miksinejä voidaan yhdistää metodien yliajomiseen monimutkaisen räätälöinnin saavuttamiseksi.
Mukautettujen miksinien luominen
Voit myös luoda omia miksinejä kapseloimaan uudelleenkäytettävää logiikkaa. Voit esimerkiksi luoda miksinin, joka asettaa automaattisesti nykyisen käyttäjän malliesiintymän kirjoittajaksi, tai miksinin, joka käsittelee käyttöoikeustarkistuksia.
from django.contrib.auth.mixins import UserPassesTestMixin
class AuthorRequiredMixin(UserPassesTestMixin):
def test_func(self):
return self.request.user.is_staff or (self.request.user == self.get_object().author)
def handle_no_permission(self):
# Replace with your desired redirection or error handling
return redirect('permission_denied') # Or raise an exception
Tämä AuthorRequiredMixin
sallii pääsyn vain henkilökunnan jäsenille tai objektin kirjoittajalle. Voit käyttää tätä miksinä UpdateView
- tai DeleteView
-näkymien kanssa varmistaaksesi, että vain valtuutetut käyttäjät voivat muokata tai poistaa objekteja.
4. Mallipohjan räätälöinti
Vaikka edellä mainitut tekniikat keskittyvät näkymän logiikan muokkaamiseen, mallipohjan räätälöinti on ratkaisevan tärkeää tiedon esitystavan hallinnassa. Geneeriset näkymät käyttävät mallipohjia HTML-tulosteen renderöimiseen. Voit mukauttaa näitä mallipohjia vastaamaan sovelluksesi suunnittelua ja brändäystä.
Mallipohjien nimeämiskäytännöt
Geneeriset näkymät noudattavat tiettyjä mallipohjien nimeämiskäytäntöjä. Esimerkiksi:
ListView
:<app_name>/<model_name>_list.html
(esim.articles/article_list.html
)DetailView
:<app_name>/<model_name>_detail.html
(esim.articles/article_detail.html
)CreateView
/UpdateView
:<app_name>/<model_name>_form.html
(esim.articles/article_form.html
)DeleteView
:<app_name>/<model_name>_confirm_delete.html
(esim.articles/article_confirm_delete.html
)
Voit yliajaa template_name
-attribuutin näkymäluokassa käyttääksesi eri mallipohjaa. Mallipohjan sisällä pääset käsiksi näkymän tarjoamaan dataan kontekstiobjektin kautta. Oletusarvoinen kontekstiobjektin nimi on yleensä mallin nimen pienikirjaiminen versio (esim. article
sanalle Article
). Voit muuttaa tätä käyttämällä context_object_name
-attribuuttia.
Esimerkki: ListView
-mallipohjan räätälöinti
articles/article_list.html
-mallipohjassa voit iteroida articles
-kontekstimuuttujan läpi (kuten yllä olevassa ArticleListView
-esimerkissä määriteltiin) näyttääksesi artikkelilistan.
<h1>Artikkelit</h1>
<ul>
{% for article in articles %}
<li><a href="{% url 'article_detail' article.pk %}">{{ article.title }}</a></li>
{% endfor %}
</ul>
5. Lomakkeen räätälöinti (CreateView & UpdateView)
CreateView
ja UpdateView
hyödyntävät Django-lomakkeita käyttäjän syötteiden käsittelyyn. Näiden lomakkeiden räätälöinti antaa sinun hallita näytettäviä kenttiä, niiden validointisääntöjä ja ulkoasua.
form_class
-attribuutin käyttö
Voit määrittää käytettävän lomakeluokan näkymäluokan form_class
-attribuutilla. Jos et määritä lomakeluokkaa, Django luo automaattisesti ModelForm
-luokan näkymään liitetyn mallin perusteella.
Lomakkeen metodien yliajaminen
Voit yliajaa metodeja lomakeluokassasi mukauttaaksesi sen käyttäytymistä. Yleisiä yliajettavia metodeja ovat:
__init__()
: Alusta lomake ja muokkaa sen kenttiä.clean()
: Suorita mukautettu validointi useille kentille.clean_<field_name>()
: Suorita mukautettu validointi tietylle kentälle.
Esimerkki: Artikkelilomakkeen räätälöinti
from django import forms
from .models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = ['title', 'content', 'is_published']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['content'].widget = forms.Textarea(attrs={'rows': 5})
def clean_title(self):
title = self.cleaned_data['title']
if len(title) < 5:
raise forms.ValidationError("Title must be at least 5 characters long.")
return title
Tässä esimerkissä olemme räätälöineet ArticleForm
-lomakkeen asettamalla fields
-attribuutin Meta
-luokassa määrittämään, mitkä kentät tulee sisällyttää lomakkeeseen. Olemme myös yliajaneet __init__()
-metodin mukauttaaksemme content
-kentän widgetin ja clean_title()
-metodin lisätäksemme mukautetun validoinnin title
-kentälle.
6. Dynaaminen lomakekäsittely
Joskus lomaketta on mukautettava dynaamisesti käyttäjän tai muiden tekijöiden perusteella. Tämän voi saavuttaa yliajamalla get_form_kwargs()
-metodin näkymäluokassa. Tämä metodi mahdollistaa lisäavainsana-argumenttien välittämisen lomakkeen konstruktorille.
Esimerkki: Käyttäjän välittäminen lomakkeelle
from django.views.generic import CreateView
from .models import Article
from .forms import ArticleForm
class ArticleCreateView(CreateView):
model = Article
form_class = ArticleForm
template_name = 'articles/article_form.html'
success_url = '/articles/' # Replace with your desired success URL
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['user'] = self.request.user
return kwargs
Tämän jälkeen, ArticleForm
-lomakkeessasi voit päästä käyttäjään käsiksi user
-avainsana-argumentin kautta __init__()
-metodissa.
from django import forms
from .models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = ['title', 'content', 'is_published']
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user', None)
super().__init__(*args, **kwargs)
if self.user and not self.user.is_staff:
del self.fields['is_published'] # Only staff can publish
Tässä esimerkissä välitämme nykyisen käyttäjän lomakkeelle ja poistamme dynaamisesti is_published
-kentän, jos käyttäjä ei ole henkilökunnan jäsen. Tämä osoittaa, kuinka voit dynaamisesti säätää lomaketta käyttäjän käyttöoikeuksien perusteella.
Edistynyt räätälöinti: Näkymäjoukkojen (Viewsets) käyttö
Monimutkaisemmissa sovelluksissa, erityisesti API-rajapinnoissa, kannattaa harkita Django REST Frameworkin (DRF) ViewSettejä. ViewSetit yhdistävät toisiinsa liittyvät näkymät (esim. listaus, luominen, haku, päivitys, poisto) yhdeksi luokaksi, tarjoten siistimmän ja organisoidumman tavan hallita API-rajapintoja.
Esimerkki: ArticleViewSetin luominen
from rest_framework import viewsets
from .models import Article
from .serializers import ArticleSerializer
class ArticleViewSet(viewsets.ModelViewSet):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
Tämä yksinkertainen ArticleViewSet
tarjoaa kaikki standardit CRUD (Create, Read, Update, Delete) -operaatiot artikkeleille. Voit räätälöidä ViewSettejä käyttäen samankaltaisia tekniikoita kuin geneerisiä näkymiä, kuten yliajamalla metodeja kuten get_queryset()
, perform_create()
ja perform_update()
.
Globaalit näkökohdat geneeristen näkymien räätälöinnissä
Räätälöidessäsi geneerisiä näkymiä globaalille yleisölle, pidä mielessäsi seuraavat seikat:
- Lokalisointi ja kansainvälistäminen (L10n/I18n): Varmista, että mallipohjat ja lomakkeet tukevat useita kieliä ja alueellisia muotoja. Käytä Djangon sisäänrakennettuja i18n/l10n-ominaisuuksia.
- Aikavyöhykkeet: Käsittele aikavyöhykemuunnokset oikein näyttääksesi päivämäärät ja ajat käyttäjän paikallisessa ajassa. Käytä Djangon
timezone
-moduulia. - Valuutan muotoilu: Muotoile valuutta-arvot asianmukaisesti eri alueille. Harkitse kirjaston, kuten
babel
, käyttöä valuutan muotoiluun. - Päivämäärä- ja numeromuotoilu: Käytä käyttäjän alueen mukaisia asianmukaisia päivämäärä- ja numeromuotoja.
- Saavutettavuus: Varmista, että räätälöidyt näkymät ja mallipohjat ovat vammaisten käyttäjien saatavilla. Noudata saavutettavuusohjeita, kuten WCAG.
- Responsiivinen suunnittelu: Varmista, että mallipohjat ovat responsiivisia ja mukautuvat erilaisiin näyttökokoihin ja laitteisiin, joita käyttäjät ympäri maailmaa käyttävät.
- Kulttuurinen herkkyys: Ole tietoinen kulttuurisista eroista suunnitellessasi näkymiäsi ja mallipohjiasi. Vältä kuvien tai kielen käyttöä, joka saattaisi olla loukkaavaa tietyille kulttuureille. Esimerkiksi väriyhdistelmät ja symbolit voivat olla hyvin erilaisia eri kulttuureissa.
Esimerkki: Aikavyöhykkeiden käsittely
Näyttääksesi julkaisupäivämäärän käyttäjän paikallisella aikavyöhykkeellä voit käyttää timezone
-tagia mallipohjassasi:
{% load tz %}
<p>Julkaistu: {% timezone article.publication_date %}</p>
Varmista, että sinulla on USE_TZ = True
Django-asetustiedostossasi.
Parhaat käytännöt geneeristen näkymien räätälöintiin
Noudata näitä parhaita käytäntöjä varmistaaksesi, että räätälöintisi ovat ylläpidettäviä ja tehokkaita:
- Pidä se yksinkertaisena: Vältä räätälöintiesi liiallista monimutkaistamista. Käytä yksinkertaisinta tekniikkaa, joka saavuttaa halutun tuloksen.
- Dokumentoi koodisi: Lisää kommentteja selittämään räätälöintisi ja miksi ne olivat tarpeen.
- Testaa perusteellisesti: Kirjoita yksikkötestejä varmistaaksesi, että räätälöintisi toimivat oikein.
- Käytä miksinejä viisaasti: Luo uudelleenkäytettäviä miksinejä kapseloimaan yleistä toiminnallisuutta.
- Noudata Djangon käytäntöjä: Pysy Djangon koodaus- ja nimeämiskäytäntöjen mukaisena.
- Huomioi tietoturva: Ole tietoinen mahdollisista tietoturva-aukoista räätälöidessäsi näkymiä. Puhdista käyttäjän syötteet ja suojaa yleisiltä hyökkäyksiltä, kuten Cross-Site Scripting (XSS) ja SQL-injektio.
Yhteenveto
Djangon luokkapohjaiset geneeriset näkymät tarjoavat tehokkaan ja joustavan tavan rakentaa verkkosovelluksia. Hallitsemalla tässä oppaassa esitellyt räätälöintitekniikat voit mukauttaa geneeriset näkymät omiin erityistarpeisiisi luoden tehokkaita, ylläpidettäviä ja globaalisti saavutettavia verkkosovelluksia. Yksinkertaisista attribuuttien yliajomisista monimutkaisiin metodien yliajomisiin ja miksinien käyttöön, mahdollisuudet ovat valtavat. Muista ottaa huomioon globaalit näkökulmat ja parhaat käytännöt varmistaaksesi, että sovelluksesi palvelevat monipuolista kansainvälistä yleisöä.