Django genvägsfunktioner¶
Paketet django.shortcuts samlar hjälpfunktioner och klasser som ”spänner över” flera nivåer av MVC. Med andra ord introducerar dessa funktioner/klasser kontrollerad koppling för bekvämlighetens skull.
render()¶
- render(request, template_name, context=None, content_type=None, status=None, using=None)[source]¶
Kombinerar en given mall med en given kontextordbok och returnerar ett
HttpResponse-objekt med den återgivna texten.Django tillhandahåller inte en genvägsfunktion som returnerar en
TemplateResponseeftersom konstruktören förTemplateResponseerbjuder samma bekvämlighetsnivå somrender().
Nödvändiga argument¶
begäranDet request-objekt som används för att generera detta svar.
template_nameDet fullständiga namnet på en mall som ska användas eller en sekvens av mallnamn. Om en sekvens anges kommer den första mallen som finns att användas. Se dokumentation för laddning av mallar för mer information om hur mallar hittas.
Valfria argument¶
kontextEn ordlista med värden som ska läggas till i mallkontexten. Som standard är detta en tom ordbok. Om ett värde i ordlistan är anropsbart kommer vyn att anropa det precis innan mallen renderas.
innehållstypDen MIME-typ som ska användas för det resulterande dokumentet. Standardvärdet är
'text/html'.statusStatuskoden för svaret. Standardvärdet är
200.använderNAMEför en mallmotor som ska användas för att ladda mallen.
Exempel¶
I följande exempel återges mallen myapp/index.html med MIME-typen application/xhtml+xml:
from django.shortcuts import render
def my_view(request):
# View code here...
return render(
request,
"myapp/index.html",
{
"foo": "bar",
},
content_type="application/xhtml+xml",
)
Detta exempel är likvärdigt med:
from django.http import HttpResponse
from django.template import loader
def my_view(request):
# View code here...
t = loader.get_template("myapp/index.html")
c = {"foo": "bar"}
return HttpResponse(t.render(c, request), content_type="application/xhtml+xml")
omdirigera()¶
- redirect(to, *args, permanent=False, preserve_request=False, **kwargs)[source]¶
Returnerar en
HttpResponseRedirecttill lämplig URL för de argument som skickas.Argumenten skulle kunna vara:
En modell: modellens
get_absolute_url()-funktion kommer att anropas.Ett namn på vyn, eventuellt med argument:
reverse()kommer att användas för att lösa upp namnet bakåt.En absolut eller relativ URL, som kommer att användas som den är för omdirigeringsplatsen.
Som standard utfärdas en tillfällig omdirigering med en 302-statuskod. Om
permanent=Trueutfärdas en permanent omdirigering med en 301-statuskod.Om
preserve_request=True, instruerar svaret användaragenten att bevara metoden och innehållet i den ursprungliga begäran när omdirigeringen utfärdas. I det här fallet används statuskod 307 för tillfälliga omdirigeringar och statuskod 308 för permanenta omdirigeringar. Detta illustreras bättre i följande tabell:permanent
bevara_begäran
HTTP-statuskod
TrueFalse301
FalseFalse302
FalseTrue307
TrueTrue308
Changed in Django 5.2:Argumentet
preserve_requestlades till.
Exempel¶
Du kan använda funktionen redirect() på flera olika sätt.
Genom att skicka något objekt kommer objektets
get_absolute_url()-metod att anropas för att räkna ut omdirigeringsadressen:from django.shortcuts import redirect def my_view(request): ... obj = MyModel.objects.get(...) return redirect(obj)
Genom att skicka namnet på en vy och eventuellt några positionella eller nyckelordsargument; URL:en kommer att lösas omvänt med hjälp av
reverse()-metoden:def my_view(request): ... return redirect("some-view-name", foo="bar")
Genom att ange en hårdkodad URL att omdirigera till:
def my_view(request): ... return redirect("/some/url/")
Detta fungerar även med fullständiga webbadresser:
def my_view(request): ... return redirect("https://example.com/")
Som standard returnerar redirect() en tillfällig omdirigering. Alla ovanstående formulär accepterar ett permanent argument; om det sätts till True kommer en permanent omdirigering att returneras:
def my_view(request):
...
obj = MyModel.objects.get(...)
return redirect(obj, permanent=True)
Dessutom kan argumentet preserve_request användas för att bevara den ursprungliga HTTP-metoden:
def my_view(request):
# ...
obj = MyModel.objects.get(...)
if request.method in ("POST", "PUT"):
# Redirection preserves the original request method.
return redirect(obj, preserve_request=True)
# ...
get_object_or_404()¶
- aget_object_or_404(klass, *args, **kwargs)¶
Asynkron version:
aget_object_or_404()Anropar
get()på en given modellhanterare, men det ger upphov tillHttp404istället för modellensDoesNotExistundantag.
Argument¶
Exempel¶
Följande exempel hämtar objektet med primärnyckeln 1 från MyModel:
from django.shortcuts import get_object_or_404
def my_view(request):
obj = get_object_or_404(MyModel, pk=1)
Detta exempel är likvärdigt med:
from django.http import Http404
def my_view(request):
try:
obj = MyModel.objects.get(pk=1)
except MyModel.DoesNotExist:
raise Http404("No MyModel matches the given query.")
Det vanligaste användningsfallet är att skicka en Model, som visas ovan. Men du kan också skicka en QuerySet-instans:
queryset = Book.objects.filter(title__startswith="M")
get_object_or_404(queryset, pk=1)
Exemplet ovan är lite konstruerat eftersom det motsvarar att göra:
get_object_or_404(Book, title__startswith="M", pk=1)
men det kan vara användbart om du får variabeln queryset från någon annanstans.
Slutligen kan du också använda en Manager. Detta är användbart till exempel om du har en custom manager:
get_object_or_404(Book.dahl_objects, title="Matilda")
Du kan också använda related managers:
author = Author.objects.get(name="Roald Dahl")
get_object_or_404(author.book_set, title="Matilda")
Observera: Precis som med get() kommer ett MultipleObjectsReturned undantag att uppstå om mer än ett objekt hittas.
get_list_or_404()¶
- aget_list_or_404(klass, *args, **kwargs)¶
Asynkron version:
aget_list_or_404()Returnerar resultatet av
filter()på en given modellhanterare som kastas till en lista, vilket gerHttp404om den resulterande listan är tom.
Argument¶
Exempel¶
Följande exempel hämtar alla publicerade objekt från MyModel:
from django.shortcuts import get_list_or_404
def my_view(request):
my_objects = get_list_or_404(MyModel, published=True)
Detta exempel är likvärdigt med:
from django.http import Http404
def my_view(request):
my_objects = list(MyModel.objects.filter(published=True))
if not my_objects:
raise Http404("No MyModel matches the given query.")