Функции-короткого пути Django
Пакет django.shortcuts собирает вспомогательные функции и классы, которые «перекрывают» несколько уровней MVC. Другими словами, эти функции/классы вводят управляемое связывание для удобства.
render()
-
render(request, template_name, context=None, content_type=None, status=None, using=None)[source] -
Объединяет заданный шаблон с заданным словарем контекста и возвращает объект
HttpResponseс отрендеренным текстом.Django не предоставляет функцию-короткого пути, которая возвращает
TemplateResponse, потому что конструкторTemplateResponseпредлагает тот же уровень удобства, что иrender().
Обязательные аргументы
-
request - Объект запроса, используемый для генерации этого ответа.
-
template_name - Полное имя используемого шаблона или последовательность имён шаблонов. Если задана последовательность, будет использован первый существующий шаблон. См. документацию по загрузке шаблонов для получения более подробной информации о том, как находятся шаблоны.
Необязательные аргументы
-
context - Словарь значений для добавления в контекст шаблона. По умолчанию это пустой словарь. Если значение в словаре является вызываемым, представление вызовет его непосредственно перед рендерингом шаблона.
-
content_type - Тип MIME, который следует использовать для результирующего документа. По умолчанию
'text/html'. -
status - Код состояния для ответа. По умолчанию
200. -
using - Имя движка шаблонов для загрузки шаблона.
Пример
Следующий пример рендерит шаблон myapp/index.html с типом MIME 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",
)
Этот пример эквивалентен:
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")
redirect()
-
redirect(to, *args, permanent=False, **kwargs)[source] -
Возвращает
HttpResponseRedirectна соответствующий URL для переданных аргументов.Аргументы могут быть:
- Модель: будет вызван метод
get_absolute_url()модели. - Имя представления, возможно, с аргументами: будет использован
reverse()для обратного разрешения имени. - Абсолютный или относительный URL, который будет использован как есть для места перенаправления.
По умолчанию выполняется временное перенаправление; передайте
permanent=Trueдля выполнения постоянного перенаправления. - Модель: будет вызван метод
Примеры
Вы можете использовать функцию redirect() различными способами.
-
Передав некоторый объект; для определения URL перенаправления будет вызван метод
get_absolute_url()этого объекта:from django.shortcuts import redirect def my_view(request): ... obj = MyModel.objects.get(...) return redirect(obj) -
Передав имя представления и, по желанию, некоторые позиционные или именованные аргументы; URL будет обратным способом разрешён с использованием метода
reverse():def my_view(request): ... return redirect("some-view-name", foo="bar") -
Передав жёстко заданный URL для перенаправления:
def my_view(request): ... return redirect("/some/url/")Это также работает с полными URL:
def my_view(request): ... return redirect("https://example.com/")
По умолчанию redirect() возвращает временное перенаправление. Все вышеперечисленные формы принимают аргумент permanent; если он установлен на True, будет возвращено постоянное перенаправление:
def my_view(request):
...
obj = MyModel.objects.get(...)
return redirect(obj, permanent=True)
get_object_or_404()
-
get_object_or_404(klass, *args, **kwargs)[source]
-
aget_object_or_404(klass, *args, **kwargs) -
Асинхронная версия:
aget_object_or_404()Вызывает
get()в заданном менеджере модели, но вместо исключенияDoesNotExistмодели возникаетHttp404.
Аргументы
-
klass - Класс
Model, менеджерManagerили экземплярQuerySet, из которого следует получить объект. -
*args -
Q objects. -
**kwargs - Параметры поиска, которые должны быть в формате, принятом
get()иfilter().
Пример
В следующем примере извлекается объект с первичным ключом 1 из MyModel:
from django.shortcuts import get_object_or_404
def my_view(request):
obj = get_object_or_404(MyModel, pk=1)
Этот пример эквивалентен:
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.")
Наиболее распространённый случай использования — передача Model, как показано выше. Однако вы также можете передать экземпляр QuerySet:
queryset = Book.objects.filter(title__startswith="M") get_object_or_404(queryset, pk=1)
Приведённый выше пример немного искусственный, поскольку он эквивалентен:
get_object_or_404(Book, title__startswith="M", pk=1)
но может быть полезен, если переменная queryset передаётся из другого места.
Наконец, вы также можете использовать менеджер Manager. Это полезно, например, если у вас есть пользовательский менеджер:
get_object_or_404(Book.dahl_objects, title="Matilda")
Вы также можете использовать related managers:
author = Author.objects.get(name="Roald Dahl") get_object_or_404(author.book_set, title="Matilda")
Примечание: как и в случае с get(), исключение MultipleObjectsReturned будет поднято, если найдено более одного объекта.
aget_object_or_404() функция была добавлена.
get_list_or_404()
-
get_list_or_404(klass, *args, **kwargs)[source]
-
aget_list_or_404(klass, *args, **kwargs) -
Асинхронная версия:
aget_list_or_404()Возвращает результат
filter()в заданном менеджере модели, преобразованном в список, и поднимаетHttp404, если полученный список пустой.
Аргументы
-
klass - Экземпляр
Model,ManagerилиQuerySet, из которого следует получить список. -
*args -
Q objects. -
**kwargs - Параметры поиска, которые должны быть в формате, принятом
get()иfilter().
Пример
В следующем примере извлекаются все опубликованные объекты из MyModel:
from django.shortcuts import get_list_or_404
def my_view(request):
my_objects = get_list_or_404(MyModel, published=True)
Этот пример эквивалентен:
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.")
aget_list_or_404() функция была добавлена.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/5.1/topics/http/shortcuts/