English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
La vue est un type de page Web dans l'application Django, fournissant des fonctionnalités spécifiques et des modèles spécifiques. Par exemple, dans une application de blog, il peut y avoir plusieurs vues :
Page d'accueil du blog - Affiche les derniers articles. Accédez à la page "detail"- Page de lien permanent pour un seul projet. Page d'archive - Affiche tous les entrées des mois de l'année donnée. Page d'archive mensuelle - Affiche tous les éléments de chaque jour du mois donné. Page d'archive de jour - 显示某一天所有条目。 评论操作 - 处理发布评论的一个给定输入。
在我们的 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文件中的代码如下:
Exemple 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/,或任何其它路径的根,应用程序仍然可以工作。
Voici ce qui se passe si l'utilisateur accède à “}}/polls/34/», ce qui se passe dans ce système :
Django trouve le correspondant '^polls/' Puis, Django retire le texte correspondant ("polls/"
et envoyer le texte restant - "34/" - à 'polls.urls' configuration URL pour le traitement supplémentaire correspondant r'^(?P<question_id>[0-9]+)/$' pour appeler la vue detail() comme suit :
detail(request=<HttpRequest object>, question_id='34')
question_id='34' est venant de (?P<question_id>[0-9]+) d'une partie, utilisez des parenthèses de schéma autour pour "capturer" le texte correspondant au schéma et le transmettre en tant que paramètre à la fonction de vue; ?P<question_id> définit le nom du schéma correspondant qui sera utilisé pour identifier le schéma correspondant ; et [0-9]+ L'expression régulière correspond à une séquence de nombres (dans un nombre).
Étant donné que le schéma URL est une expression régulière, vous pouvez l'utiliser pour faire des choses, sans aucune restriction. De plus, il n'est pas nécessaire d'ajouter .html à l'URL - à moins que vous ne le vouliez, dans ce cas, vous pouvez le faire ainsi :
url(r'^polls/latest\.html$', views.index),
Chaque vue s'occupe de l'une des deux tâches suivantes : retourner un objet HttpResponse contenant le contenu de la page demandée, ou lancer une exception, comme HTTP 404Modifier polls/Voici le code du fichier views.py :
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) # Laissez le reste des vues (detail, results, vote) inchangé
Il y a un problème ici, car le design web est codé en dur dans la vue. Si vous souhaitez changer l'apparence de la page, vous devez modifier ce code Python. Par conséquent, utilisons le système de modèle Django pour créer des vues qui peuvent utiliser des modèles pour séparer le code Python./templates/polls/index.html Ajoutez le code suivant :
{% 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})
Attention ici : la vue déclenche une erreur HTTP404Exception, si le problème avec l'ID de la demande n'existe pas.
Nous discuterons de ce que l'on peut faire avec polls/Si vous souhaitez utiliser rapidement l'exemple ci-dessus, polls/templates/polls/Le fichier 'detail.html' doit simplement contenir :
{{ question }}
délève 404 Erreur, nous demandons maintenant une question inexistante, comme : http://127.0.0.1:8000/polls/100/Voici le résultat affiché :
Si l'objet n'existe pas, une utilisation courante est deget() et de déclencher une erreur HTTP404Erreur. Django propose un raccourci. Voici la vue detail() :/views.py réécrit :
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() prend un modèle Django en premier paramètre et un nombre quelconque de paramètres nommés, qu'il transmet à la fonction get() de la gestion du modèle.
Si l'objet n'existe pas, cela déclenche une erreur HTTP404.
Il y a aussi get_list_or_404() est une fonction qui fonctionne de la même manière que get_object_or_404()- En plus d'utiliser la méthode filter() plutôt que get(). Si la liste est vide, cela peut entraîner une erreur HTTP404.
Retournons à notre application polls et à la vue detail()/Le modèle template 'detail.html' a l'aspect suivant :
<h1{{ question.question_text }}</h1> <ul> {% for choice in question.choice_set.all %} <li>{{ choice.choice_text }}</li>/li> {% endfor %} </ul>
Le système de modèle utilise la syntaxe de requête par point pour accéder aux propriétés des variables. Dans cet exemple {{question.question_text }},le premier Django cherche dans le dictionnaire de l'objet question. Si il ne trouve pas, il essaie une recherche de propriété – si la recherche de propriété échoue, il essaie une recherche par index de liste.
Maintenant, testons le code que nous avons écrit ci-dessus, ouvrez-le dans le navigateur : http://127.0.0.1:8000/polls/5/ Nous obtenons le résultat suivant :
Rappelez-vous, lorsque nous sommes dans polls/index.html relie à une question, la partie codée en dur du lien est la suivante :
<li><a href="/polls/{{question.id}}/">{{question.question_text}}</a></li>
Le problème de ce travail qui utilise une méthode de liaison serrée et codée en dur est : il utilise beaucoup de modèles pour changer l'URL du projet. Cependant,既然 polls.urls module définit les paramètres de nom url() fonction, vous pouvez supprimer le tag {% url %} en utilisant {% url %} modèle pour supprimer la dépendance spécifique de l'URL définie dans la configuration de l'URL :
<li><a href="{etail'question.id%}">{{question.question_text}}</a></li>
Ce mode de fonctionnement consiste à définir les URL recherchées dans le module polls.urls. Vous pouvez voir précisément la définition du nom de l'URL 'detail' comme suit :
... # la valeur 'name' appelée par le tag de modèle {% url %} $, views.results, name='results'),-9]+)/$, views.index, name='index'), ...
Si vous souhaitez modifier l'URL de la vue détaillée de vote en une autre, peut-être comme polls/specifics/12/ Pour remplacer dans le modèle (ou templates), il faut dans polls/Changement de urls.py
... # ajouté le mot 'specifics' url(r'^specifics',/(?P<question_id>[0-9]+)/$, views.index, name='index'), ...
Ce tutoriel de projet a une seule application - polls. Dans un projet Django réel, il peut y avoir cinq, dix, vingt ou plus d'applications. Comment Django les distingue-t-il par leurs URL ? Par exemple, l'application de vote a une vue détaillée, donc il peut y avoir la même application dans un même projet de blog. Comment utiliser le tag de modèle {% url %} pour faire comprendre à Django quels applications ont une telle vue ?
La réponse est d'ajouter l'espace de nom à URLconf. Dans polls/Fichier urls.py, continuez de progresser, ajoutez le nom de l'application et configurez l'espace de nom de l'application, ouvrez polls/urls.py:
Exemple 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'), ]
Maintenant, modifiez polls/Template index.html, ouvre polls/templates/polls/Ajoutez le code suivant au fichier index.html :
<li><a href="{etail'question.id%}">{{question.question_text}}</a></li>
Le pointe vers le nom d'espace vue detail, ouvre polls/templates/polls/Fichier index.html suivant :
<li><a href="{olls:detail'question.id%}">{{question.question_text}}</a></li>