Põhjalik juhend Django klassipõhiste geneeriliste vaadete kohandamiseks võimsa ja tõhusa veebiarenduse jaoks. Õppige, kuidas vaateid oma konkreetsetele vajadustele kohandada.
Django Klassipõhised Vaated: Generiliste Vaadete Kohandamise Meisterlikkus
Django klassipõhised vaated (CBV) pakuvad võimsa ja taaskasutatava viisi veebirakenduste ehitamiseks. Generilised vaated, CBV-de alamhulk, pakuvad valmis lahendusi tavalistele ülesannetele, nagu loendite kuvamine, detailvaated, objektide loomine, värskendamine ja kustutamine. Kuigi need geneerilised vaated on uskumatult mugavad, vajavad need sageli kohandamist, et need sobiksid ideaalselt teie rakenduse konkreetsete vajadustega. See põhjalik juhend uurib erinevaid tehnikaid Django geneeriliste vaadete kohandamiseks, võimaldades teil luua tõhusaid ja hallatavaid veebirakendusi.
Django Klassipõhiste Vaadete Mõistmine
Enne kohandamise juurde asumist kordame CBV-de ja geneeriliste vaadete põhitõdesid. Traditsioonilised funktsioonipõhised vaated (FBV) käsitlevad HTTP-päringuid otse ühe funktsiooni sees. CBV-d seevastu korraldavad vaate loogika klassideks, pakkudes struktureeritumat ja objektorienteeritumat lähenemist. See toob kaasa parema koodikorralduse, taaskasutatavuse ja testitavuse.
Generilised vaated on eelnevalt ehitatud CBV-d, mis on loodud tavaliste veebiarendusülesannete käsitlemiseks. Nad pärivad baasklassidest nagu View
ja TemplateView
ning pakuvad spetsialiseeritud funktsioone. Levinud geneerilised vaated on järgmised:
ListView
: Kuvab objektide loendi.DetailView
: Kuvab ĂĽksiku objekti ĂĽksikasjad.CreateView
: Käsitleb objekti loomist vormi abil.UpdateView
: Käsitleb objekti värskendamist vormi abil.DeleteView
: Käsitleb objekti kustutamist.
Need geneerilised vaated pakuvad kindla aluse, kuid reaalsed rakendused nõuavad sageli nende käitumise kohandamist. Uurime erinevaid kohandamistehnikaid.
Kohandamistehnikad
Django geneeriliste vaadete kohandamiseks on mitmeid viise, alates lihtsatest atribuutide alistamistest kuni keerukamate meetodite alistamiseni. Sobiv tehnika sõltub vajaliku kohandamise tasemest.
1. Atribuudi Alistamine
Lihtsaim kohandamise vorm hõlmab geneerilise vaateklassi atribuutide alistamist. See on ideaalne põhiliste atribuutide, nagu mudel, malli nimi või kontekstiobjekti nimi, muutmiseks.
Näide: ListView
Kohandamine
Oletame, et soovite kuvada artiklite loendi, kuid soovite kasutada kohandatud malli ja erinevat kontekstiobjekti 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')
Selles näites oleme alistanud atribuudid model
, template_name
ja context_object_name
. Oleme alistanud ka meetodi get_queryset
, et filtreerida artikleid ja järjestada neid avaldamiskuupäeva järgi. Meetod get_queryset
annab teile kontrolli selle üle, millised objektid on loendivaatesse kaasatud. See on kasulik filtreerimise, järjestamise ja lehekülgede kaupa jaotamise rakendamiseks.
2. Meetodi Alistamine
Meetodi alistamine võimaldab teil muuta olemasolevate meetodite käitumist geneerilises vaateklassis. See annab suurema kontrolli vaate loogika üle. Levinud meetodid, mida alistada, on järgmised:
get_queryset()
: Kontrollib vaate poolt kasutatavat päringukomplekti.get_context_data()
: Lisab andmeid malli konteksti.form_valid()
: Käsitleb edukat vormi esitamist.form_invalid()
: Käsitleb kehtetut vormi esitamist.get_success_url()
: Määrab URL-i, kuhu pärast edukat vormi esitamist suunata.get_object()
: Toob objekti DetailView, UpdateView ja DeleteView jaoks
Näide: DetailView
Kohandamine
Oletame, et soovite kuvada artikli ĂĽksikasju, kuid soovite malli konteksti lisada ka seotud kommentaarid.
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
Siin oleme alistanud meetodi get_context_data()
, et lisada malli konteksti muutuja comments
. See võimaldab teil hõlpsasti juurde pääseda seotud kommentaaridele ja neid kuvada mallis article_detail.html
.
3. Miksiinide Kasutamine
Miksiinid on taaskasutatavad klassid, mis pakuvad spetsiifilist funktsionaalsust. Neid saab kombineerida geneeriliste vaadetega, et lisada funktsioone ilma vaate põhilist loogikat muutmata. Django pakub mitmeid sisseehitatud miksiine ja saate luua ka oma.
Näide: LoginRequiredMixin
Kasutamine
LoginRequiredMixin
tagab, et ainult sisseloginud kasutajad saavad konkreetsele vaatele juurde pääseda.
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/' # Asenda soovitud eduka URL-iga
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
Selles näites oleme kasutanud LoginRequiredMixin
, et piirata juurdepääsu ArticleCreateView
ainult sisseloginud kasutajatele. Oleme alistanud ka meetodi form_valid
, et määrata artikli autor automaatselt praegusele kasutajale. See näitab, kuidas miksiine saab kombineerida meetodi alistamisega, et saavutada keerukaid kohandamisi.
Kohandatud Miksiinide Loomine
Saate luua ka oma miksiine, et kapseldada taaskasutatavat loogikat. Näiteks võite luua miksiini, mis määrab praeguse kasutaja automaatselt mudeli eksemplari autoriks, või miksiini, mis käsitleb õiguste kontrolle.
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):
# Asenda soovitud ümbersuunamise või veakäsitlusega
return redirect('permission_denied') # Või tõsta erand
See AuthorRequiredMixin
võimaldab juurdepääsu ainult personali liikmetele või objekti autorile. Saate seda miksiini kasutada koos UpdateView
või DeleteView
, et tagada, et ainult volitatud kasutajad saavad objekte muuta või kustutada.
4. Malli Kohandamine
Kuigi ülaltoodud tehnikad keskenduvad vaate loogika muutmisele, on malli kohandamine andmete esitamise kontrollimiseks ülioluline. Generilised vaated kasutavad HTML-väljundi renderdamiseks malle. Saate neid malle kohandada, et need vastaksid teie rakenduse kujundusele ja brändingule.
Malli Nimetamise Konventsioonid
Generilised vaated järgivad konkreetseid malli nimetamise konventsioone. Näiteks:
ListView
:<rakenduse_nimi>/<mudeli_nimi>_list.html
(ntarticles/article_list.html
)DetailView
:<rakenduse_nimi>/<mudeli_nimi>_detail.html
(ntarticles/article_detail.html
)CreateView
/UpdateView
:<rakenduse_nimi>/<mudeli_nimi>_form.html
(ntarticles/article_form.html
)DeleteView
:<rakenduse_nimi>/<mudeli_nimi>_confirm_delete.html
(ntarticles/article_confirm_delete.html
)
Vaateklassis saate atribuudi template_name
alistada, et kasutada erinevat malli. Mallis saate juurde pääseda andmetele, mida vaade pakub, kontekstiobjekti kaudu. Vaikimisi on kontekstiobjekti nimi tavaliselt mudeli nime väiketäheline versioon (nt article
mudeli Article
jaoks). Saate seda muuta atribuudi context_object_name
abil.
Näide: ListView
Malli Kohandamine
Mallis articles/article_list.html
saate itereerida ĂĽle kontekstimuutuja articles
(nagu on määratletud ülaltoodud näites ArticleListView
), et kuvada artiklite loend.
<h1>Artiklid</h1>
<ul>
{% for article in articles %}
<li><a href="{% url 'article_detail' article.pk %}">{{ article.title }}</a></li>
{% endfor %}
</ul>
5. Vormi Kohandamine (CreateView & UpdateView)
CreateView
ja UpdateView
kasutavad kasutaja sisendi käsitlemiseks Django vorme. Nende vormide kohandamine võimaldab teil kontrollida kuvatavaid välju, nende valideerimise reegleid ja välimust.
form_class
Kasutamine
Saate vormi klassi määrata atribuudi form_class
abil vaateklassis. Kui te vormi klassi ei määra, genereerib Django automaatselt ModelForm
, mis põhineb vaatega seotud mudelil.
Vormi Meetodite Alistamine
Saate oma vormi klassis meetodeid alistada, et kohandada selle käitumist. Levinud meetodid, mida alistada, on järgmised:
__init__()
: Vormi initsialiseerimine ja selle väljade muutmine.clean()
: Kohandatud valideerimise teostamine mitme välja vahel.clean_<välja_nimi>()
: Kohandatud valideerimise teostamine konkreetse välja jaoks.
Näide: Artikli Vormi Kohandamine
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("Pealkiri peab olema vähemalt 5 tähemärgi pikkune.")
return title
Selles näites oleme kohandanud ArticleForm
, määrates atribuudi fields
klassis Meta
, et määrata, millised väljad tuleks vormi kaasata. Oleme alistanud ka meetodi __init__()
, et kohandada välja content
vidinat, ja meetodi clean_title()
, et lisada välja title
jaoks kohandatud valideerimine.
6. Dünaamiline Vormi Käsitlemine
Mõnikord peate vormi dünaamiliselt kohandama kasutaja või muude tegurite põhjal. Saate seda saavutada, alistades meetodi get_form_kwargs()
vaateklassis. See meetod võimaldab teil edastada vormi konstruktorile täiendavaid märksõna argumente.
Näide: Kasutaja Edastamine Vormile
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/' # Asenda soovitud eduka URL-iga
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['user'] = self.request.user
return kwargs
Seejärel saate oma ArticleForm
vormis juurde pääseda kasutajale märksõna argumendi user
kaudu meetodis __init__()
.
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'] # Ainult personal saab avaldada
Selles näites edastame praeguse kasutaja vormile ja eemaldame dünaamiliselt välja is_published
, kui kasutaja ei ole personali liige. See näitab, kuidas saate vormi dünaamiliselt kohandada vastavalt kasutaja õigustele.
Täpsem Kohandamine: Vaatekomplektide Kasutamine
Keerukamate rakenduste jaoks, eriti API-dega seotud rakenduste puhul, kaaluge Django REST Framework'i (DRF) ViewSet'ide kasutamist. ViewSet'id kombineerivad seotud vaated (nt loend, loomine, toomine, värskendamine, kustutamine) ühte klassi, pakkudes API-lõpp-punktide haldamiseks puhtamat ja korrastatumat viisi.
Näide: ArticleViewSet Loomine
from rest_framework import viewsets
from .models import Article
from .serializers import ArticleSerializer
class ArticleViewSet(viewsets.ModelViewSet):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
See lihtne ArticleViewSet
pakub kõiki artiklite standardseid CRUD (Create, Read, Update, Delete) toiminguid. ViewSet'e saate kohandada samade tehnikate abil nagu geneerilisi vaateid, näiteks alistades meetodeid nagu get_queryset()
, perform_create()
ja perform_update()
.
Globaalsed Kaalutlused Generiliste Vaadete Kohandamisel
Generiliste vaadete kohandamisel globaalsele vaatajaskonnale pidage silmas järgmisi kaalutlusi:
- Lokaliseerimine ja rahvusvahelistamine (L10n/I18n): Veenduge, et teie mallid ja vormid toetavad mitut keelt ja piirkondlikku vormingut. Kasutage Django sisseehitatud i18n/l10n funktsioone.
- Ajavööndid: Käsitlege ajavööndi teisendusi õigesti, et kuvada kuupäevi ja kellaaegu kasutaja kohalikus ajas. Kasutage Django moodulit
timezone
. - Valuuta Vormindamine: Vormindage valuuta väärtusi vastavalt erinevatele piirkondadele. Valuuta vormindamiseks kaaluge sellise teegi nagu
babel
kasutamist. - Kuupäeva ja Numbri Vormindamine: Kasutage sobivaid kuupäeva ja numbri vorminguid, mis põhinevad kasutaja lokaadil.
- Juurdepääsetavus: Veenduge, et teie kohandatud vaated ja mallid oleksid juurdepääsetavad puuetega kasutajatele. Järgige juurdepääsetavuse juhiseid, nagu WCAG.
- Reageeriv Kujundus: Veenduge, et teie mallid on reageerivad ja kohanduvad erinevate ekraanisuuruste ja seadmetega, mida kasutajad ĂĽle kogu maailma kasutavad.
- Kultuuriline Tundlikkus: Olge oma vaadete ja mallide kujundamisel teadlik kultuurilistest erinevustest. Vältige piltide või keele kasutamist, mis võivad teatud kultuuridele solvavad olla. Näiteks võivad värvide assotsiatsioonid ja sümbolid kultuurides väga erineva tähendusega olla.
Näide: Ajavööndite Käsitlemine
Avaldusaeg kuvamiseks kasutaja kohalikus ajavööndis saate mallis kasutada silti timezone
:
{% load tz %}
<p>Avaldatud: {% timezone article.publication_date %}</p>
Veenduge, et teie Django seadistusfailis on USE_TZ = True
.
Parimad Tavad Generiliste Vaadete Kohandamiseks
Järgige neid parimaid tavasid, et tagada oma kohandamiste hallatavus ja tõhusus:
- Hoia Lihtsalt: Vältige kohandamiste ülemäärast keerukust. Kasutage lihtsaimat tehnikat, mis saavutab soovitud tulemuse.
- Dokumenteeri Oma Kood: Lisage kommentaare, et selgitada oma kohandamisi ja miks need vajalikud olid.
- Testi Põhjalikult: Kirjutage ühikteste, et tagada oma kohandamiste korrektne toimimine.
- Kasuta Miksiine Arukalt: Looge taaskasutatavaid miksiine, et kapseldada tavalist funktsionaalsust.
- Järgi Django Konventsioone: Järgige Django koodi stiili ja nimetamise konventsioone.
- Kaalu Turvalisust: Olge vaadete kohandamisel teadlik potentsiaalsetest turvaaukudest. Puhastage kasutaja sisendit ja kaitske end tavaliste rĂĽnnakute, nagu Cross-Site Scripting (XSS) ja SQL Injection, eest.
Järeldus
Django klassipõhised geneerilised vaated pakuvad võimsa ja paindliku viisi veebirakenduste ehitamiseks. Saavutades käesolevas juhendis kirjeldatud kohandamistehnikad, saate kohandada geneerilisi vaateid vastavalt oma konkreetsetele vajadustele, luues tõhusaid, hallatavaid ja globaalselt juurdepääsetavaid veebirakendusi. Alates lihtsatest atribuutide alistamistest kuni keeruka meetodi alistamise ja miksiini kasutamiseni on võimalused tohutud. Ärge unustage arvestada globaalsete perspektiivide ja parimate tavadega, et tagada oma rakenduste vastavus mitmekesisele rahvusvahelisele vaatajaskonnale.