English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Introdução Rápida Django-Visão

A visão é um tipo de página web em aplicativos Django, que oferece funções específicas e tem um template específico. Por exemplo, em um aplicativo de blog, podem haver várias visões:

Página inicial do blog - Exibe os últimos vários artigos. Acesse a página "detail"- Página de link permanente para um item específico. Página de arquivo - Exibe todas as entradas de cada mês do ano especificado. Página de arquivo de mês - Exibe todos os itens de cada dia do mês especificado. Página de arquivo de dia - 显示某一天所有条目。 评论操作 - 处理发布评论的一个给定输入。

在我们的 poll 应用程序,有以下四个视图:

问题的“index”页- 显示最后几个问题。 问题的“detail”页 - 显示一个问题文本,没有结果但有一个表单用来投票。 问题的“results”页面 - 显示结果一个特定问题。 投票操作 - 处理投票在一个特定的问题进行具体选择。

在Django中,网页和其他内容由视图提供。每个视图由一个简单的Python函数来表示(或方法,基于类的视图)。Django会选择一个视图通过考察多数民众赞成请求的URL(准确地说,在域名之后URL的一部分)。

一个URL模式是一个简单的URL的一般形式 - 例如:/newsarchive/<year>/<month>/.

编写更多的视图

现在,让我们添加一些视图在 polls/views.py。这些视图略有不同,因为他们需要一个参数:

def detail(request, question_id):
    return HttpResponse("You're looking at question %s." % question_id)
def results(request, question_id):
    response = "You're looking at the results of question %s.""
    return HttpResponse(response % question_id)
def vote(request, question_id):
    return HttpResponse("You're voting on question %s." % question_id)

这些新的视图加入到 polls.urls 模块中如下的 url() 调用,polls/urls.py文件中的代码如下:

from django.conf.urls import url
from django.conf.urls import url
app_name = 'polls'
 # ex: /polls/
    urlpatterns = [
 # ex: /polls/5/
    $, views.results, name='results'),-9]+)/$, views.index, name='index'),
 # ex: /polls/5/$, views.detail, name='detail'),/
    $, views.results, name='results'),-9]+)/$, views.detail, name='detail'),/results
 # ex: /polls/5/vote/
    $, views.results, name='results'),-9]+)/vote/$, views.vote, name='vote'),
]

您可以在浏览器打开“/polls/34/”。它会运行detail()方法,并显示任何提供的URL内容。 再次尝试访问 “/polls/34/$, views.detail, name='detail'),/” and “/polls/34/vote/”  – 这将显示占位符结果和投票页面。

include() 可以很容易包含入插件和网址。因为polls是在它们自己的URL配置(polls/urls.py),它们可以放置在“/polls/”,或 “/fun_polls/”,或在“/content/polls/”,或任何其它路径的根,应用程序仍然可以工作。

A seguir está se o usuário entrar "}}/polls/34/O que acontece nessa sistema:

O Django encontrará o padrão correspondente '^polls/" Depois que o Django remove o texto correspondente ("polls/"

e enviar o texto restante – "34/" – para 'polls.urls' configuração de URL para processamento adicional correspondente r'^(?P<question_id>[0-9]+)/$' para chamar a vista detail() da seguinte forma:

detail(request=<HttpRequest object>, question_id='34')

question_id='34' é do tipo (?P<question_id>[0-9]+) parte, usando os parênteses de padrão ao redor para 'capturar' o texto correspondente ao padrão e passá-lo como parâmetro para a função de vista; ?P<question_id> define o nome do padrão correspondente que será usado para identificar o padrão; e [0-9]+ A expressão regular coincide com uma sequência de números (em um número).

Como o padrão de URL é uma expressão regular, você pode usá-lo para fazer algumas coisas, sem nenhuma restrição. E também não é necessário adicionar .html ao URL - a menos que você queira, nesse caso, você pode fazer assim:

url(r'^polls/latest\.html$', views.index),

Escreva uma vista para implementar a funcionalidade

Cada vista é responsável por fazer uma de duas coisas: retornar um objeto HttpResponse contendo o conteúdo da página solicitada ou lançar uma exceção, como HTTP 404Modifique polls/O código do arquivo views.py é o seguinte:

from django.http import HttpResponse
from .models import Question
def index(request):
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    output = ', '.join([q.question_text for q in latest_question_list])
    return HttpResponse(output)
# Deixe o resto das vistas (detail, results, vote) inalteradas

Aqui há um problema, pois o design da página web está rigidamente codificado na visão. Se você quiser mudar a aparência da página, é necessário editar este código Python. Portanto, vamos usar o sistema de modelos do Django, criando vistas que podem usar modelos para separar o código Python./templates/polls/index.html Coloque o seguinte código:

{% if latest_question_list %}
    <ul>
    {% for question in latest_question_list %}
        <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}

现在我们来更新首页视图 polls/views.py使用以下模板(代码):

from django.http import HttpResponse
from django.template import loader
from .models import Question
def index(request):
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    template = loader.get_template('polls/index.html')
    context = {
        'latest_question_list': latest_question_list,
    }
    return HttpResponse(template.render(context, request))

该代码加载模板调用polls/index.html,然后传递给它的上下文。上下文是一个字典以Python对象映射模板变量名。现在访问URL(http://127.0.0.1:8000/polls/)查看结果 :

快捷方式: render()

这是一个非常习惯用法来加载模板,填充上下文中和渲染模板的结果返回一个HttpResponse对象。Django提供了一个捷径。下面是完整的index() 视图,改写polls/views.py为:

from django.shortcuts import render
from .models import Question
def index(request):
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    context = {'latest_question_list': latest_question_list}
    return render(request, 'polls/index.html', context)

请注意,当在各个视图做到了这一点,我们不再需要导入加载器和HttpResponse对象(想保留HttpResponse,如果仍然有短截 detail, results, 和 vote 方法。

引发404错误

现在,让我们来解决这个问题详细视图 - 显示为给定的民意调查问题文本的页面。这里添加视图代码(polls/views.py):

from django.http import Http404
from django.shortcuts import render
from .models import Question
# ...
def detail(request, question_id):
    try:
        question = Question.objects.get(pk=question_id)
    except Question.DoesNotExist:
        raise Http404("Question does not exist")
    return render(request, 'polls/detail.html', {'question': question})

注意这里:视图引发HTTP404异常,如果与请求ID的问题并不存在。

我们将讨论可以把 polls/detail.html 在后面做一些修改,但如果想快速使用上面的实例,polls/templates/polls/detail.html 文件只需包含:


   {{question}}


引发 404 错误,现在我们请求一个不存在问题,如:http://127.0.0.1:8000/polls/100/,显示结果如下:

快捷方式: get_object_or_404()

如果对象不存在的一个非常习惯用法使用get()并引发HTTP404错误。Django提供了一个捷径。以下是 detail() 视图,polls/views.py 重写:

from django.shortcuts import get_object_or_404, render
from .models import Question
# ...
def detail(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    return render(request, 'polls/detail.html', {'question': question})

get_object_or_404()função aceita um modelo Django como o primeiro parâmetro e uma quantidade arbitrária de parâmetros nomeados, que são passados para a função get() da gestão do modelo.

如果对象不存在将引发HTTP404.

还存在get_list_or_404()função, que funciona de maneira semelhante a get_object_or_404()- Além de usar filter() em vez do método get(). Se a lista estiver vazia, ela causará HTTP404.

usando o sistema de templates

Voltemos ao nosso aplicativo polls detail() visão. Devido ao problema de variáveis de contexto, aqui polls/detail.html modelo parece ser assim:

<h1{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
    <li>{{ choice.choice_text }}</li>/li>
{% endfor %}
</ul>


O sistema de modelos usa a sintaxe de consulta de ponto para acessar as propriedades das variáveis. Neste exemplo {{question.question_text }}. O primeiro Django realmente busca no dicionário do objeto question. Se não encontrar, ele tenta uma consulta de atributo – se a consulta de atributo falhar, ele tenta uma consulta de índice de lista.
Agora testamos o código que escrevemos acima, abra no navegador: http://127.0.0.1:8000/polls/5/ Os resultados são os seguintes:

Remova o endereço URL rígido do modelo

Lembre-se, quando estamos em polls/index.html liga a uma questão, a parte rígida da ligação é assim:

  <li><a href="/polls/{{question.id}}/">{{question.question_text}}</a></li>

O problema com este método de hardcode, altamente acoplado, é que ele usa muitos modelos para alterar o URL do projeto. No entanto, uma vez que o polls.urls módulo define o parâmetro de nome da função url(), você pode usar a etiqueta de modelo {% url %} para eliminar a dependência de caminho específico definido na configuração de URL:

  <li><a href="{etail'question.id%}">{{question.question_text}}</a></li>

Este método funciona através de definir a busca do URL especificada no módulo polls.urls. Você pode ver a definição do nome do URL 'detail' conforme abaixo:

  ...
# o valor 'name' chamado pela etiqueta de modelo {% url %}
$, views.results, name='results'),-9]+)/$, views.index, name='index'),
...

Se você quiser mudar o URL da visualização detalhada de votação para outro, talvez como polls/specifics/12/ Para substituir em um modelo (ou templates), é necessário em polls/urls.py altere-o:

  ...
# adicionado a palavra 'specifics'
url(r'^specifics',/(?P<question_id>[0-9]+)/$, views.index, name='index'),
...

Nome do URL do espaço de nomes

Este projeto do tutorial tem apenas um aplicativo - polls. Em um projeto Django real, podem haver cinco, dez, vinte ou mais aplicativos. Como o Django distingue os nomes dos URLs deles? Por exemplo, o aplicativo de votação tem uma visualização detalhada, então pode haver o mesmo aplicativo em um projeto de blog. Como usar a etiqueta de modelo {% url %} para fazer o Django saber qual aplicativo possui tal visão?

A resposta é adicionar o espaço de nomes ao URLconf. Em polls/Arquivo urls.py, continue avançando, adicione o nome do aplicativo configurar o espaço de nomes do aplicativo, abrir polls/urls.py:

from django.conf.urls import url
from django.conf.urls import url
from . import views
app_name = 'polls'
    urlpatterns = [
    $, views.results, name='results'),-9]+)/$, views.index, name='index'),
    $, views.results, name='results'),-9]+)/$, views.detail, name='detail'),/results
    $, views.results, name='results'),-9]+)/vote/$, views.vote, name='vote'),
]

Agora modifique polls/Abra o template index.html, polls/templates/polls/Adicione o seguinte código ao arquivo index.html:

  <li><a href="{etail'question.id%}">{{question.question_text}}</a></li>

Faça-o apontar para a visão detail no espaço de nomes detail, abra polls/templates/polls/O arquivo index.html está conforme a seguir:

  <li><a href="{olls:detail'question.id%}">{{question.question_text}}</a></li>