English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
La vista es un tipo de página web en el aplicación Django, que ofrece funciones específicas y tiene plantillas específicas. Por ejemplo, en una aplicación de blog, puede haber las siguientes vistas:
Página principal del blog - Mostrar los últimos artículos. Entrar a la página "detail"- Enlace permanente a la página del proyecto individual. Página de archivo - Mostrar todas las entradas de cada mes del año dado. Página de archivo de mes - Mostrar todos los elementos de cada día del mes dado. Página de archivo de cielo - 显示某一天所有条目。 评论操作 - 处理发布评论的一个给定输入。
在我们的 poll 应用程序,有以下四个视图:
问题的“index”页- 显示最后几个问题。 问题的“detail”页 - 显示一个问题文本,没有结果但有一个表单用来投票。 问题的“results”页面 - 显示结果一个特定问题。 投票操作 - 处理投票在一个特定的问题进行具体选择。
在Django中,网页和其他内容由视图提供。每个视图由一个简单的Python函数来表示(或方法,基于类的视图)。Django会选择一个视图通过考察多数民众赞成请求的URL(准确地说,在域名之后URL的一部分)。
一个URL模式是一个简单的URL的一般形式 - 例如:/newsarchive/<year>/<month>/.
现在,让我们添加一些视图在 polls/views.py。这些视图略有不同,因为他们需要一个参数:
def detalle(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 continuación, se muestra si el usuario ingresa “}}/polls/34/”, en este sistema, ¿qué ocurrirá:
Django encontrará la coincidencia '^polls/' Luego, Django quitará el texto coincidente ("polls/"
y envía el texto restante – "34/'' – al 'polls.urls' configuración de URL para el procesamiento adicional de coincidencias r'^(?P<question_id>[0-9]+)/$' para llamar a la vista detail() como se muestra a continuación:
detail(request=<HttpRequest object>, question_id='34')
question_id='34'' viene de (?P<question_id>[0-9]+) parte, usando los corchetes de模式的 "captura" para obtener el texto coincidente como parámetro para la función de vista; ?P<question_id> define el nombre del patrón coincidente que se usará para identificar el mencionado patrón; y [0-9]+ La expresión regular coincide con una secuencia de dígitos (en un solo número).
Dado que el patrón de URL es una expresión regular, se puede usar para hacer algunas cosas, sin restricciones. Y no es necesario agregar .html a la URL, a menos que desee, en este caso, puede hacerlo así:
url(r'^polls/latest\.html$', views.index),
Cada vista se encarga de una de dos tareas: devuelve un objeto HttpResponse que contiene el contenido de la página solicitada, o lanza una excepción, como HTTP 404。 Modifique polls/El código del archivo views.py es el siguiente:
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) # Deje el resto de las vistas (detail, results, vote) sin cambios
Aquí hay un problema, ya que el diseño de la página web está estrictamente codificado en la vista. Si desea cambiar el aspecto de la página, debe editar este código Python. Por lo tanto, utilicemos el sistema de plantillas de Django para separar el código Python utilizando vistas que puedan usar plantillas. polls/templates/polls/index.html Introduzca el siguiente 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 detalle(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})
Notar aquí: la vista genera un HTTP404excepciones, si no existen problemas con el ID de solicitud.
discutiremos lo que se puede hacer con polls/detail.html se hicieron algunos cambios, pero si quieres usar rápidamente el ejemplo anterior, polls/templates/polls/El archivo detail.html solo debe contener:
{{ question }}
genera 404 Error, ahora estamos solicitando un problema inexistente, como: http://127.0.0.1:8000/polls/100/, los resultados se muestran a continuación:
una forma muy común de manejar el caso en el que el objeto no existe utilizando get() y generando un HTTP404Error. Django ofrece un atajo. A continuación se muestra la vista detail() de polls/views.py rewrite:
from django.shortcuts import get_object_or_404, render from .models import Question # ... def detalle(request, question_id): question = get_object_or_404(Question, pk=question_id) return render(request, 'polls/detail.html', {'question': question})
get_object_or_404()) función acepta un modelo Django como primer parámetro y una cantidad ilimitada de parámetros de palabra clave, que se pasan a la función get() de la gestión del modelo.
si el objeto no existe, generará un HTTP404.
hay también get_list_or_404()) función, que funciona de manera similar a get_object_or_404())- Además de usar filter() en lugar del método get(). Si la lista está vacía, causará un HTTP404.
Volvemos a nuestra aplicación polls detalle() vista. Debido a problemas de variables de contexto, aquí los polls/detail.html plantilla se ve así:
<h1{{ question.question_text }}</h1> <ul> {% for choice in question.choice_set.all %} <li>{{ choice.choice_text }}</li>/li> {% endfor %} </ul>
El sistema de plantillas utiliza la sintaxis de consulta de puntos para acceder a las propiedades de las variables. En este ejemplo {{question.question_text }}, el primer Django realmente busca en el diccionario del objeto question. Si no lo encuentra, intenta una consulta de atributo – si la consulta de atributo falla, intenta una búsqueda de índice de lista.
Ahora probemos el código que escribimos anteriormente, abra el navegador: http://127.0.0.1:8000/polls/5/ Se obtiene el siguiente resultado:
Recuerda, cuando estamos en polls/index.html enlazando a un problema, la parte enlazada en forma rígida es como sigue:
<li><a href="/polls/{{question.id}}/">{{question.question_text}}</a></li>
El problema de este método de codificación en forma rígida y fuertemente acoplado es que usa muchas plantillas para cambiar las URL del proyecto. Sin embargo, ya que el módulo polls.urls define el parámetro de nombre de la función url() en la configuración de URL, puedes eliminar la dependencia de la ruta específica de URL configurada usando la etiqueta de plantilla {% url %}:
<li><a href="{etail'question.id%}">{{question.question_text}}</a></li>
Este método de funcionamiento es definir la URL de búsqueda especificada en el módulo polls.urls. Puedes ver claramente la definición del nombre de URL 'detail' como se muestra a continuación:
... # el valor 'name' como llamado por la etiqueta de plantilla {% url %} $, views.results, name='results'),-9]+)/$, views.index, name='index'), ...
Si deseas cambiar la URL de la vista detallada de votación a otra, tal vez como polls/specifics/12/ Para reemplazar en la plantilla (o templates), necesitas en polls/urls.py cambiarlo:
... # agregado la palabra 'specifics' url(r'^specifics',/(?P<question_id>[0-9]+)/$, views.index, name='index'), ...
Este proyecto de tutorial tiene una única aplicación - polls. En proyectos Django reales, pueden haber cinco, diez, veinte o más aplicaciones. ¿Cómo distingue Django sus nombres de URL? Por ejemplo, la aplicación de votación tiene una vista detallada, por lo que podría haber la misma aplicación en el mismo proyecto de un blog. ¿Cómo usar la etiqueta de plantilla {% url %} para que Django sepa qué aplicaciones tienen tal vista?
La respuesta es agregar el espacio de nombres a URLconf. En polls/El archivo urls.py, avanzando, agregar el nombre de la aplicación configuración del espacio de nombres de la aplicación, 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'), ]
Ahora modifique polls/Abra el archivo de plantilla index.html en polls/templates/polls/Añada el siguiente código al archivo index.html:
<li><a href="{etail'question.id%}">{{question.question_text}}</a></li>
Hágalo apuntar al espacio de nombres de vista detail, abra polls/templates/polls/El archivo index.html es el siguiente:
<li><a href="{olls:detail'question.id%}">{{question.question_text}}</a></li>