Aprendizaje de documentos de Django 4.0 (2)

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
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

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))

inserte la descripción de la imagen aquí
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}}

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

Una función de acceso directo: get_object_or_404()

Modificar encuestas/vistas.py

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

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>

inserte la descripción de la imagen aquí

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'),
]

inserte la descripción de la imagen aquí
í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>

Supongo que te gusta

Origin blog.csdn.net/weixin_46322367/article/details/129627929
Recomendado
Clasificación