English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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),
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/)查看结果 :
这是一个非常习惯用法来加载模板,填充上下文中和渲染模板的结果返回一个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 方法。
现在,让我们来解决这个问题详细视图 - 显示为给定的民意调查问题文本的页面。这里添加视图代码(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()并引发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.
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:
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'), ...
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>