Funções de atalho do DjangoLink para este cabeçalho

O pacote django.shortcuts agrega funções e classes auxiliares que “abrangem” múltiplos níveis do MVC. Em outras palavras, essas funções/classes introduzem uma composição controlada por uma questão de conveniência.

render()Link para este cabeçalho

render(request, template_name, context=None, content_type=None, status=None, using=None)Link para esta definição

Combina uma dado template com um dado dicionário de dados e retorna um objeto HttpResponse com aquele texto renderizado.

Django does not provide a shortcut function which returns a TemplateResponse because the constructor of TemplateResponse offers the same level of convenience as render().

Argumentos requeridosLink para este cabeçalho

request

O objeto de requisição usado para gerar esta resposta.

template_name

O nome completo do template a ser usado ou uma sequência de nomes de templates. Se uma sequência é dada, o primeiro template que existir será usado. Veja a documentação de carga de templates para maiores informações de como os templates são encontrados.

Argumentos opcionaisLink para este cabeçalho

context

Um dicionário de valores que são adicionados ao contexto do template. Por padrao, é um dicionário vazio. Se um valor neste dicionário é um executável, a “view” irá executá-lo logo antes de renderizar o template.

content_type

The MIME type to use for the resulting document. Defaults to 'text/html'.

status

O código de status da resposta. Padrão é 200.

using

O NAME do mecanismo de template a ser usado para a carga do template.

ExemploLink para este cabeçalho

O exemplo seguinte renderiza o template myapp/index.html com o tipo MIME application/xhtml+xml:

Code
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",
    )

Este exemplo é equivalente a:

Code
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()Link para este cabeçalho

redirect(to, *args, permanent=False, preserve_request=False, max_length=MAX_URL_REDIRECT_LENGTH, **kwargs)Link para esta definição

Retorna uma HttpResponseRedirect para a URL apropriada de acordo com os argumentos passados.

Os argumentos podem ser:

  • A model: the model’s get_absolute_url() function will be called.

  • Um nome de uma “view”, possivelmente com argumentos: a reverse() será usada para resolver inversamente o nome

  • Uma URL absoluta ou relativa, a qual será usada como tal para o local do redirecionamento.

By default, a temporary redirect is issued with a 302 status code. If permanent=True, a permanent redirect is issued with a 301 status code.

If preserve_request=True, the response instructs the user agent to preserve the method and body of the original request when issuing the redirect. In this case, temporary redirects use a 307 status code, and permanent redirects use a 308 status code. This is better illustrated in the following table:

permanent

preserve_request

HTTP status code

True

False

301

False

False

302

False

True

307

True

True

308

An optional max_length keyword argument can be provided to override the maximum allowed length for the redirect URL. Set it to None to disable the length check.

ExemplosLink para este cabeçalho

Você pode usar a função redirect() de várias maneiras.

  1. Passando algum objeto; o método get_absolute_url() daquele objeto será chamado para descobrir a URL de redirecionamento:

    Code
    from django.shortcuts import redirect
    
    
    def my_view(request):
        ...
        obj = MyModel.objects.get(...)
        return redirect(obj)
    
  2. Passando o nome de uma “view” e opcionalmente algum argumento posicional ou nomeado; a URL será inversamente resolvida usando o método reverse()

    Code
    def my_view(request):
        ...
        return redirect("some-view-name", foo="bar")
    
  3. By passing a hardcoded URL to redirect to:

    Code
    def my_view(request):
        ...
        return redirect("/some/url/")
    

    This also works with full URLs:

    Code
    def my_view(request):
        ...
        return redirect("https://example.com/")
    

Por padrão, a redirect() retorna um redirecionamento temporário. Todas as formas acima aceitam um argumento chamado permanent; se definido como True um redirecionamento permanente será retornado:

Code
def my_view(request):
    ...
    obj = MyModel.objects.get(...)
    return redirect(obj, permanent=True)

Additionally, the preserve_request argument can be used to preserve the original HTTP method:

Code
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)
    # ...

resolve_url()Link para este cabeçalho

resolve_url(to, *args, **kwargs)Link para esta definição

Returns a URL string by resolving and normalizing the given to argument into a concrete URL. The parameter to may be:

  • An object implementing get_absolute_url(), in which case the method will be called and its result returned.

  • A view name, view function, or view class, possibly with arguments passed as *args and **kwargs, in which case reverse() will be used to reverse-resolve the view.

  • A URL string, which will be returned unchanged.

This function is used internally by the redirect() shortcut to determine the target URL for the redirect location.

ExemplosLink para este cabeçalho

  1. Resolving a URL for a model that defines get_absolute_url():

    models.py
    Python
    from django.db import models
    from django.urls import reverse
    
    
    class Article(models.Model):
        title = models.CharField(max_length=100)
    
        def get_absolute_url(self):
            return reverse("article-detail", args=[self.pk])
    
    views.py
    Python
    from django.http import JsonResponse
    from django.shortcuts import get_object_or_404, resolve_url
    from .models import Article
    
    
    def article_api_view(request, pk):
        """Return metadata about an article, including its canonical URL."""
        article = get_object_or_404(Article, pk=pk)
        return JsonResponse(
            {
                "id": article.pk,
                "title": article.title,
                "url": resolve_url(article),
            }
        )
    
  2. Resolving a target URL for use outside of a redirect, such as in an HTTP response header:

    Code
    from django.conf import settings
    from django.http import HttpResponse
    from django.shortcuts import resolve_url
    
    
    def login_success(request):
        response = HttpResponse("Login successful")
        response["X-Next-URL"] = resolve_url(settings.LOGIN_REDIRECT_URL)
        return response
    

get_object_or_404()Link para este cabeçalho

get_object_or_404(klass, *args, **kwargs)Link para esta definição
aget_object_or_404(klass, *args, **kwargs)Link para esta definição

Asynchronous version: aget_object_or_404()

Calls get() on a given model manager, but it raises Http404 instead of the model’s DoesNotExist exception.

ArgumentosLink para este cabeçalho

klass

Uma classe Model, um Manager, ou uma instância de QuerySet da qual pegar o objeto.

*args

Q() objects.

**kwargs

Parâmetros de filtro, o quais devem estar no mesmo formato que os aceito por get() e filter().

ExemploLink para este cabeçalho

O exemplo seguinte pega o objeto do modelo MyModel e com chave-primária igual a 1:

Code
from django.shortcuts import get_object_or_404


def my_view(request):
    obj = get_object_or_404(MyModel, pk=1)

Este exemplo é equivalente a:

Code
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.")

O caso de uso mais comum é passar uma Model, como mostrado acima. Porém, você pode também passar uma instância de QuerySet:

Code
queryset = Book.objects.filter(title__startswith="M")
get_object_or_404(queryset, pk=1)

O exemplo acima é um pouco exagerado já que é equivalente a fazer:

Code
get_object_or_404(Book, title__startswith="M", pk=1)

mas pode ser útil se você estiver passando uma varável queryset vinda de algum outro lugar.

E fInalmente, você pode usar uma Manager. Isso é útil por exemplo quando você tem uma custom manager:

Code
get_object_or_404(Book.dahl_objects, title="Matilda")

Você pode usar também uma "Manager"/s relacionados:

Code
author = Author.objects.get(name="Roald Dahl")
get_object_or_404(author.book_set, title="Matilda")

Nota: Assimcomo o get(), uma exceção do tipo MultipleObjectsReturned será emitida se mais de um objeto for encontrado..

get_list_or_404()Link para este cabeçalho

get_list_or_404(klass, *args, **kwargs)Link para esta definição
aget_list_or_404(klass, *args, **kwargs)Link para esta definição

Asynchronous version: aget_list_or_404()

Returns the result of filter() on a given model manager cast to a list, raising Http404 if the resulting list is empty.

ArgumentosLink para este cabeçalho

klass

Uma instância Model, Manager ou de QuerySet da qual ler a lista.

*args

Q() objects.

**kwargs

Parâmetros de filtro, o quais devem estar no mesmo formato que os aceito por get() e filter().

ExemploLink para este cabeçalho

O exemplo seguinte pega todos os objetos publicados do MyModel:

Code
from django.shortcuts import get_list_or_404


def my_view(request):
    my_objects = get_list_or_404(MyModel, published=True)

Este exemplo é equivalente a:

Code
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.")