Het onderstaande artikel is het 6e deel van de verkenningsserie over Django Class-Based Views (CBV), waarin we behandelen hoe we simpele pagina-rendering en redirectverwerking kunnen automatiseren met behulp van TemplateView en RedirectView. In het vorige artikel (5e deel) hebben we CRUD geïmplementeerd met CreateView
, UpdateView
en DeleteView
; dit keer zullen we onderzoeken hoe we lichtere pagina's en redirectverwerking efficiënt kunnen opzetten.
Voor de vorige aflevering, klik op de onderstaande link!
CRUD implementeren met CreateView, UpdateView, DeleteView
“Automatiseer eenvoudig de structuur van pagina's en redirects met Django TemplateView en RedirectView!”
1. Waarom hebben we TemplateView & RedirectView nodig?
TemplateView en RedirectView zijn class-based views (Generic Views) die zijn gespecialiseerd in de eenvoudigste toepassingen in Django.
-
TemplateView
-
Handig voor het doorgeven van een statische pagina of eenvoudige context naar een template zonder complexe dataverwerking.
-
Bijvoorbeeld: “Over” pagina, “Veelgestelde Vragen” pagina, 404/500 fout pagina's (indien apart ingesteld) etc.
-
-
RedirectView
-
Gebruikt om onmiddellijk naar een specifieke URL te redirecten.
-
Bijvoorbeeld: Redirect naar een specifieke pagina bij toegang tot de domeinroot(
/
), een eenvoudige verkorte URL service, campagne-promotie redirects etc.
-
Beide richten zich op eenvoudige pagina's zonder databaseoperaties of formuliervalidatie, wat ze anders maakt dan eerder besproken views zoals FormView
, CreateView
en anderen.
2. Gebruik van TemplateView
2.1 Basisstructuur
# views.py
from django.views.generic import TemplateView
class HomePageView(TemplateView):
template_name = 'home.html'
-
template_name
: specificeert het pad naar het templatebestand dat gerenderd moet worden. -
Zelfs zonder het
get()
method te overschrijven, rendert het standaard het template dat is opgegeven intemplate_name
bij een GET-aanroep.
2.2 Verbinden met urls.py
# urls.py
from django.urls import path
from .views import HomePageView
urlpatterns = [
path('', HomePageView.as_view(), name='home'),
]
- Bij toegang tot de root URL (
""
) wordt hethome.html
template weergegeven.
2.3 Template Voorbeeld: home.html
<!DOCTYPE html>
<html>
<head>
<title>Homepage</title>
</head>
<body>
<h1>Hallo! Dit is de homepage.</h1>
</body>
</html>
3. Contextgegevens doorgeven in TemplateView
Bovendien, als je eenvoudige variabelen naar het template wilt doorgeven, overschrijf je de get_context_data()
methode.
from django.views.generic import TemplateView
class AboutPageView(TemplateView):
template_name = 'about.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['page_title'] = 'Over Ons'
context['description'] = 'Deze site is een voorbeeld ter introductie van Django CBV.'
return context
description
variabelen in het template gebruiken:
<!-- about.html -->
<!DOCTYPE html>
<html>
<head>
<title>{{ page_title }}</title>
</head>
<body>
<h1>{{ page_title }}</h1>
<p>{{ description }}</p>
</body>
</html>
Tip:
TemplateView is bijzonder nuttig voor het maken van eenvoudige pagina's die geen databasequery vereisen,
Als je echter gemeenschappelijke variabelen in meerdere templates nodig hebt, overweeg dan om te combineren met een Mixin of een basis template.
4. Gebruik van RedirectView
4.1 Basisstructuur
# views.py
from django.views.generic import RedirectView
class BlogRedirectView(RedirectView):
pattern_name = 'blog_list' # URL naam
# (optioneel) Parameters voor URL reversie kunnen hier worden opgegeven
# query_string = True # Of de querystring behouden moet worden
# permanent = False # Of het een permanente redirect betreft (301 vs 302)
-
pattern_name
: Als je de URL naam (bijv.'blog_list'
) uiturls.py
opgeeft, wordt tijdens het uitvoeren van de view naar die pad geredirect. -
Als je
permanent=True
instelt, zal het een permanente redirect (301) uitvoeren, anders wordt de standaard (False
) een tijdelijke redirect (302) uitgevoerd. -
Als je
query_string=True
instelt, dan wordt de bestaande querystring van de URL (?page=2
etc.) ook op de redirectdoel-URL toegevoegd.
4.2 Verbinden met urls.py
# urls.py
from django.urls import path
from .views import BlogRedirectView, HomePageView
urlpatterns = [
path('go-to-blog/', BlogRedirectView.as_view(), name='go_to_blog'),
path('', HomePageView.as_view(), name='home'),
]
- Bij toegang tot
/go-to-blog/
wordt naar de URL-patroon dat als'blog_list'
is opgegeven, geredirect.
4.3 Directe URL opgeven
In plaats van een URL-naam, kun je ook direct een absoluut pad of externe link in de url
eigenschap invoeren.
class ExternalRedirectView(RedirectView):
url = 'https://www.djangoproject.com/'
urlpatterns = [
path('django-home/', ExternalRedirectView.as_view(), name='django_home'),
]
- Dit zorgt ervoor dat
/django-home/
→https://www.djangoproject.com/
geredirect wordt.
5. Voorbeelden van TemplateView & RedirectView
-
Mededeling pagina: Als je een statische pagina wilt tonen met vaste mededelingsteksten zonder database-integratie, kun je
TemplateView
gebruiken. -
FAQ / ‘Binnenkort’ pagina: Handig voor het snel aanbieden van product FAQ's of tijdelijke onderhoudspagina's.
-
Redirect van domeinroot: Eenvoudige redirect logica zoals “haal de hoofd pagina op en redirect naar /home/” kan worden geautomatiseerd met
RedirectView
. -
Verbinding met externe dienstlinks: Net zoals een verkorte URL, wanneer iemand naar een specifieke route gaat en naar een externe site wordt gestuurd.
6. Vergelijking met FBV
Functionaliteit | FBV (Functie Gegevens View) | TemplateView / RedirectView (Class-Based View) |
---|---|---|
Statische pagina rendering (bijv. FAQ) | def faq(request): return render(request, 'faq.html') etc. direct geschreven |
TemplateView: Pagina'rendering geautomatiseerd door alleen template_name op te geven |
Eenvoudige redirects | return redirect('some_url') / HttpResponseRedirect(...) gebruiken |
RedirectView: Gegevens kan doorgeven van slechts een URL of pattern_name |
Extra context gegevens doorgeven | Elke keer context = {...} -> render(...) verwerken |
Mogelijkheid tot beheer via get_context_data() op een gestructureerde en consistente manier |
Code structuur / Onderhoud | Hoewel korte pagina's of eenvoudige redirects FBV geen probleem zijn, ontstaat er duplicatie wanneer er veel statische pagina's of redirects zijn. | “Enkele instellingen als eigenschappen of methoden gescheiden” maken onderhoud gemakkelijker. |
Ontwikkelingsproductiviteit (sleutelwoorden) | “Directe render-, redirect functies gebruiken -> mogelijkheid tot duplicatie” | “Tijd besparen, consistentie in code, onderhoudsverbetering” |
7. Slotopmerkingen en volgende aflevering aankondiging
TemplateView en RedirectView zijn class-based views die helpen bij het eenvoudig beheren van de eenvoudigste pagina verwerkingen binnen een Django project.
Bij het ontbreken van complexe logica zoals database-integratie of formuliervalidatie kunnen deze helpen om gedupliceerde code te verminderen en de projectstructuur netter te houden.
Nu kunnen we met CBV de meeste essentiële elementen van webontwikkeling zoals “statische pagina’s”, “redirects”, “CRUD (creëren/bijwerken/verwijderen)”, “lijsten/gedetailleerde weergaven”, “formulierverwerking” implementeren!
In de volgende aflevering (serie 7) gaan we kijken naar het gebruiken van de Mixin binnen Django om gemeenschappelijk functies eenvoudig te hergebruiken, en het efficiënt implementeren van toegangsbeheer of inlogcontrole.
Bekijk de vorige artikelen opnieuw
- Verkenningsserie over Class-Based Views (CBV) #1 - De reden om van FBV naar CBV te gaan en de houding van ontwikkelaars
- Verkenningsserie over Class-Based Views (CBV) #2 - Basisstructuur van Django's View Classes begrijpen
- Verkenningsserie over Class-Based Views (CBV) #3 - Eenvoudiger formulierverwerking met FormView
- Verkenningsserie over Class-Based Views (CBV) #4 - Gebruik van ListView & DetailView
- Verkenningsserie over Class-Based Views (CBV) #5 - CRUD implementeren met CreateView, UpdateView, DeleteView
“Automatiseer het moeizame beheer van statische pagina's en redirects met TemplateView en RedirectView, en maak uw project overzichtelijker en productiever!”
댓글이 없습니다.