English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Eine Ansicht ist eine Art von Webseiten "Typ" in der Django-Anwendung, die spezifische Funktionen bietet und über ein bestimmtes Template verfügt. Zum Beispiel könnten in einer Blog-Anwendung die folgenden Ansichten vorhanden sein:
Blog-Startseite - Zeigt die letzten paar Artikel an. Gehe zur "Detail"-Seite- Permanent verknüpfte Seite für einen einzelnen Eintrag. Archivseite - Zeigt alle Einträge für jeden Monat des angegebenen Jahres an. Monats-Archivseite - Zeigt alle Einträge für jeden Tag des angegebenen Monats an. Tag-Archivseite - 显示某一天的所有条目。 评论操作 - 处理给定输入的发布评论。
在我们的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 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'),/”和“/polls/34/vote/” – 这将显示占位符结果和投票页面。
include()可以很容易地包含插件和网址。因为polls是在它们自己的URL配置(polls/urls.py),它们可以放置在“/polls/”,或“/fun_polls/,或在“/content/polls/,或任何其他路径的根,应用程序仍然可以工作。
Hier ist, was passiert, wenn der Benutzer "}}/polls/34/”,in diesem System passiert folgendes:
Django findet das passende '^polls/' Dann entfernt Django den passenden Text ("polls/")
und sendet den verbleibenden Text – "34/" – zur 'polls.urls' URL-Konfiguration für die weitere Verarbeitung der übereinstimmenden r'^(?P<question_id>[0-9]+)/$' um die Ansicht detail() wie folgt aufzurufen:
detail(request=<HttpRequest object>, question_id='34')
question_id='34' ist von (?P<question_id>[0-9]+). Ein Teil, umgeben von den Musterklammern, "erwischt" den passenden Textmodus und übergibt ihn als Parameter an die Ansichtsfunction; ?P<question_id> definiert den Namen des Musters, das verwendet wird, um das Matching zu identifizieren; und [0-9]+ Der reguläre Ausdruck passt eine Nummernfolge (in einer Zahl) an
Da das URL-Muster ein reguläres Ausdruck ist, kann es verwendet werden, um einige Dinge zu tun, ohne irgendwelche Beschränkungen. Und es ist auch nicht notwendig, URLs mit .html hinzuzufügen – es sei denn, Sie möchten, in diesem Fall können Sie das tun:
url(r'^polls/latest\.html$', views.index),
Jede Ansicht ist für eine der beiden Aufgaben verantwortlich: ein HttpResponse-Objekt zurückzugeben, das die angeforderte Seiteninhalte enthält, oder eine Ausnahme auszulösen, wie z.B. HTTP 404。 Bearbeiten Sie polls/Die Datei views.py enthält den folgenden Code:
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) # Lassen Sie den Rest der Ansichten (detail, results, vote) unverändert
Hier gibt es ein Problem, durch: Webdesign ist fest in der Ansicht kodiert. Um das Aussehen der Seite zu ändern, muss dieses Python-Code bearbeitet werden. Daher verwenden wir das Django-Template-System, um durch Erstellen von Ansichten und Verwendung von Templates den Python-Code zu trennen. polls/templates/polls/index.html Fügen Sie den folgenden Code hinzu:
{% 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})
Beachten Sie hier: Die Ansicht löst einen HTTP404Ausnahme, falls das Problem mit der Anfrage-ID nicht existiert.
Wir werden besprechen, was man mit polls/Wenn Sie den obigen Beispiel schnell verwenden möchten, polls/templates/polls/Das detail.html-Datei enthält nur:
{{question}}
auslösen 404 Fehler, jetzt fordern wir ein nicht existierendes Problem an, wie z.B. http://127.0.0.1:8000/polls/100/,und das Ergebnis wird wie folgt angezeigt:
Eine sehr gebräuchliche Verwendung von get() und dem Auslösen eines HTTP404Fehler. Django bietet einen Kurzbefehl. Hier ist die detail() Ansicht, polls/views.py umgeschrieben:
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()Funktion akzeptiert ein Django-Modell als ersten Parameter und eine beliebige Anzahl von Schlüsselwörtern als Parameter, die an die get() Funktion der Modellverwaltung weitergeleitet werden.
Falls das Objekt nicht existiert, wird ein HTTP404.
Es gibt auch eine get_list_or_404()Funktion, die ähnlich funktioniert wie get_object_or_404()- Außer dem Verwenden von filter() anstatt get() Methode. Wenn die Liste leer ist, kann es einen HTTP404.
Kommen wir zurück zu unserer polls-Anwendung und der detail() Ansicht. Wegen des Kontext-Variable-Problems, hier sind die polls/Der Template-Schnipsel sieht so aus:
<h1{{ question.question_text }}</h1> <ul> {% for choice in question.choice_set.all %} <li>{{ choice.choice_text }}</li>/li> {% endfor %} </ul>
Das Template-System verwendet die Punktsyntax, um auf Variableigenschaften zuzugreifen. In diesem Beispiel {{question.question_text }} sucht Django tatsächlich im question-Objekt-Dictionary. Wenn es nicht gefunden wird, versucht es mit einer Attributsuche – wenn die Attributsuche fehlschlägt, versucht es mit einer Listenindex-Suche.
Nun testen wir den obigen Code, öffnen Sie ihn im Browser: http://127.0.0.1:8000/polls/5/ erhalten wir die folgenden Ergebnisse:
Denken Sie daran, wenn wir in polls/index.html verweist auf ein Problem, der Teil, der fest codiert ist, sieht so aus:
<li><a href="/polls/{{question.id}}/">{{question.question_text}}</a></li>
Das Problem mit dieser festgelegten, eng miteinander verbundenen Methode ist: Sie erfordert viele Vorlagen, um die URL des Projekts zu ändern. Allerdings, da der url() -Funktion der url() -Funktion im polls.urls-Modul ein Name-Parameter definiert ist, kann man die Abhängigkeit von spezifischen URL-Pfaden in der URL-Konfiguration mit dem {% url %}-Template-Tag entfernen:
<li><a href="{etail'question.id%}">{{question.question_text}}</a></li>
Diese Methode funktioniert durch die Definition der zu suchenden URLs im polls.urls-Modul. Man kann genau sehen, wie der URL-Name 'detail' definiert ist:
... # das 'name'-Wert, wie es von dem Template-Tag {% url %} aufgerufen wird $, views.results, name='results'),-9]+)/$, views.index, name='index'), ...
Wenn Sie die URL der detaillierten Ansicht der Abstimmung ändern möchten, vielleicht wie polls/specifics/12/ Um es in der Vorlage (oder templates) zu ändern, muss in polls/urls.py ändern:
... # hinzugefügt das Wort 'specifics' url(r'^specifics',/(?P<question_id>[0-9]+)/$, views.index, name='index'), ...
Dieses Tutorial-Projekt hat nur eine Anwendung - polls. In einem tatsächlichen Django-Projekt können es fünf, zehn, zwanzig oder mehr Anwendungen geben. Wie unterscheidet Django ihre URL-Namen? Zum Beispiel hat die Abstimmungsanwendung eine detaillierte Ansicht, daher könnte in einem Blog desselben Projekts auch eine gleiche Anwendung vorhanden sein. Wie kann man mit dem Template-Tag {% url %} Django wissen lassen, welche Anwendung eine solche Ansicht in der URL hat?
Die Antwort ist, den Namensraum in die URLconf hinzuzufügen. In polls/urls.py-Datei, weiter voranzukommen, den Namen der Anwendung einstellen und den Namensraum der Anwendung öffnen, polls/urls.py:
示例 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'), ]
现在修改 polls/index.html 模板,打开 polls/templates/polls/index.html 文件添加以下代码:
<li><a href="{etail'question.id%}">{{question.question_text}}</a></li>
使其指向在命名空间 detail 视图,打开 polls/templates/polls/index.html 文件如下:
<li><a href="{olls:detail'question.id%}">{{question.question_text}}</a></li>