Schön euch kennenzulernen, alle zusammen. Ich werde den Prozess der Erstellung eines Abstimmungsantrags mit Django als Memorandum veröffentlichen. Da ich ein Anfänger von Qiita bin, verstehen Sie bitte, dass es schwierig sein kann, es zu lesen.
Serie
Die Ansicht des MVC-Modells ist ein Programm, das den Bildschirm zurückgibt, der dem Benutzer angezeigt werden soll.
Erstellen Sie im Abstimmungsantrag die folgenden vier Ansichten:
Fragen "Index" -Seite - Zeigen Sie einige der neuesten Fragen an Seite "Details" der Frage - Fragetext und Abstimmungsformular anzeigen, ohne Ergebnisse anzuzeigen Frage "Ergebnisse" - Zeigen Sie die Ergebnisse einer bestimmten Frage an Abstimmungsseite - Akzeptieren Sie die Auswahl bestimmter Fragen als Abstimmung
Die Django-Funktion, die die Ansicht von der URL abruft, heißt übrigens URLconf.
Implementieren Sie den folgenden Vorgang mit URLconf.
Benutzer greift auf "/ polls / 100 /" zu
→ Lesen Sie polls / urls.py, um mit path.'polls / 'in config / urls.py übereinzustimmen
→ Gibt Details (request =
polls/views.py
# Create your views here.
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 results of question %s."
return HttpResponse(response % question_id)
def vote(request, question_id):
return HttpResponse("You're voting on question %s." % question_id)
question_id = 100 wird zwischen <> eingefügt und von einem Teil der URL erfasst.
polls/urls.py
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'),
]
Hast du jemals etwas gemacht, das nicht funktioniert hat ... Es scheint anders zu sein. "Funktioniert tatsächlich" scheint zu bedeuten, "HttpRequest-Verarbeitung und Ausnahmeverarbeitung zu implementieren, um ein Verhalten zu realisieren, das dem tatsächlichen Betrieb entspricht".
Fügen Sie der Ansicht Folgendes hinzu.
polls/views.py
from .models import Question
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))
Übergeben Sie die Datei "latest_question_list" mit "template.render (context, request)" an polls / index.html und rendern Sie sie. Gemäß den Spezifikationen von Djangos loader.get_template wird die Rendering-Vorlage anscheinend im Verzeichnis ".templates / app name (polls)" durchsucht.
polls/templates/polls/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 %}
Sie können auch eine Verknüpfung erstellen. Importieren Sie das Rendering aus django.shortcut.
polls/views.py
from .models import Question
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)
Sie sollten einen Bildschirm wie diesen sehen.
Erstellen Sie zunächst eine Ansicht.
polls/views.py
from django.http import HttpResponse, Http404
from .models import Question
from django.shortcuts import render
def detail(request, question_id):
try:
question = Question.objects.get(pk=question_id)
except Question.DoesNotExist:
raise Http404("Question dose not exist")
return render(request, 'polls/detail.html', {'question': question})
Dann HTML
polls/templates/polls/detail.html
{{question}}
Überprüfen Sie den Betrieb.
Da question_id = 5 vorhanden ist, wird "http://127.0.0.1:8000/polls/5/" wie folgt angezeigt. ..
Da question_id = 999 nicht vorhanden ist, wird "[http://127.0.0.1:8000/polls/999/ lightboxes(http://127.0.0.1:8000/polls/999/)" wie folgt angezeigt. .. Die Ausnahme wird abgefangen und "Fragendosis nicht vorhanden" wird angezeigt.
Markieren Sie das HTML auf der Detailseite.
polls/templates/polls/detail.html
<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
<li>{{ choice.choice_text }}</li>
{% endfor %}
</ul>
"Http://127.0.0.1:8000/polls/5/" wird erneut angezeigt.
Machen Sie den URL-Teil variabel. Dies liegt daran, dass die Vorlage geändert werden muss, wenn die URL geändert wird.
Als Mechanismus haben Sie name = 'detail' in polls / urls.py> urlpatterns> path angegeben. Laden Sie dies in polls / templates / polls / index.html. Dann wird die mit name = 'detail' verknüpfte URL gelesen.
polls/templates/polls/index.html
<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>
polls/urls.py
urlpatterns = [
***
path('<int:question_id>/', views.detail, name='detail'),
***
]
Es gibt kein Problem mit der Anzeige.
Die App, die ich dieses Mal erstellt habe, ist nur eine Umfrage-App. Wenn Sie mehrere Apps erstellen, haben diese möglicherweise eine Detailansicht. Erstellen Sie einen Namespace und geben Sie ihn an, um die Detailansicht der Umfrage-App abzurufen.
Um einen Namespace zu erstellen, fügen Sie app_name =
polls/urls.py
app_name = 'polls'
urlpatterns = [
***
path('<int:question_id>/', views.detail, name='detail'),
***
]
Die URL-Angabe, die den Namespace angibt, lautet
polls/templates/polls/index.html
<li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
Das ist alles für heute. Vielen Dank.
Recommended Posts