Directorio de artículos
Escribe tu primera aplicación Django, Parte 3
Escribe más vistas
Agrega más vistas a polls /views.py . Estas vistas son un poco diferentes porque aceptan parámetros:
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello,world.You're at the polls index.")
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 result of question %s."
return HttpResponse(response % question_id)
def vote(request,question_id):
return HttpResponse("You're voting on question %s." % question_id)
Agregue estas nuevas vistas al módulo polls.urls
from django.urls import path
from . import views
urlpatterns=[
path('',views.index,name='index'),
path('<int:question_id>/',views.detail,name='detail'),
path('<int:question_id>/results/',views.results,name='results'),
path('<int:question_id>/vote/',views.vote,name='vote'),
]
> python manage.py runserver
Abra el navegador e ingrese la siguiente URL para ver si se muestra correctamente
escribe una vista realmente útil
Solo hay dos cosas que debe hacer cada vista: devolver un objeto HttpResponse que contenga el contenido de la página solicitada o lanzar una excepción, como Http404. En cuanto a qué más quieres hacer, depende de tus necesidades.
Muestra las últimas 5 preguntas de votación ordenadas por fecha de lanzamiento en la base de datos, separadas por espacios
polls/views.py
Las adiciones y cambios son los siguientes, y los demás permanecen sin cambios
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)
Separe el diseño de la página del código.
Primero, cree un directorio de plantillas dentro de su directorio de encuestas. Django buscará archivos de plantilla en este directorio. Cree un directorio de encuestas en el directorio de plantillas y cree un nuevo archivo index.html en el directorio de encuestas y escriba el siguiente contenido:
encuestas/templates/encuestas/index.html
{% 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 %}
Actualice la vista de índice en polls/views.py para usar la plantilla
from django.template import loader
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))
Verá una lista desordenada de las preguntas de la encuesta "Qué pasa" que agregamos en el Tutorial Parte 2, con un enlace a la página de detalles de la encuesta.
Una función de atajo: render()
Anular la vista index(), polls/views.py
from django.shortcuts import render
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)
arroja un error 404
encuestas/vistas.py
from django.http import Http404
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})
Esta vista arroja una excepción Http404 si el problema correspondiente al ID de problema especificado no existe.
encuestas/plantillas/encuestas/detalle.html
{
{
question}}
Una función de acceso directo: get_object_or_404()
Modificar encuestas/vistas.py
También existe la función get_list_or_404(), que funciona igual que get_object_or_404(), excepto que la función get() se reemplaza por una función filter(). Si la lista está vacía, se lanzará una excepción Http404.
Usa el sistema de plantillas
encuestas/plantillas/encuestas/detalle.html
<h1>{
{
question.question_text}}</h1>
<ul>
{
% for choice in question.choice_set.all %}
<li>{
{
choice.choice_text}}</li>
{
% endfor %}
</ul>
Eliminar URL codificadas en plantillas
Modificar encuestas/index.html
<li><a href="{% url 'detail' question.id %}">{
{
question.question_text }}</a></li>
Esta etiqueta funciona buscando una entrada con el nombre especificado en la definición de URL del módulo polls.urls.
Si desea cambiar la URL de la vista de detalles de la encuesta, por ejemplo polls/specifics/12/
, no necesita modificar nada en la plantilla (incluidas otras plantillas), solo modifíquela ligeramente en polls/urls.py
: como:path('specifics/<int:question_id>/',views.detail,name='detail'),
Agregar un espacio de nombres al nombre de la URL
El proyecto tutorial tiene una sola aplicación, encuestas. En un proyecto real de Django, puede haber cinco, diez, veinte o incluso más aplicaciones. ¿Cómo distingue Django las URL con el mismo nombre?
encuestas/urls.py añadir
app_name='polls'
Editar encuestas/index.html
<li><a href="{% url 'polls:detail' question.id %}">{
{
question.question_text }}</a></li>
El contenido actual de cada código es el siguiente:
polls/views.py
from django.http import HttpResponse
from django.shortcuts import get_object_or_404,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)
def detail(request,question_id):
question=get_object_or_404(Question,pk=question_id)
return render(request,'polls/detail.html', {
'question':question})
def results(request,question_id):
response = "You're looking at the result of question %s."
return HttpResponse(response % question_id)
def vote(request,question_id):
return HttpResponse("You're voting on question %s." % question_id)
encuestas/urls.py
from django.urls import path
from . import views
app_name='polls'
urlpatterns=[
path('',views.index,name='index'),
path('<int:question_id>/',views.detail,name='detail'),
path('<int:question_id>/results/',views.results,name='results'),
path('<int:question_id>/vote/',views.vote,name='vote'),
]
índice.html
{
% if latest_question_list %}
<ul>
{
% for question in latest_question_list %}
<li><a href="{% url 'polls:detail' question.id %}">{
{
question.question_text }}</a></li>
{
% endfor %}
</ul>
{
% else %}
<p>No polls are available.</p>
{
% endif %}
detalle.html
<h1>{
{
question.question_text}}</h1>
<ul>
{
% for choice in question.choice_set.all %}
<li>{
{
choice.choice_text}}</li>
{
% endfor %}
</ul>