Annexe D: Référence des vues génériques
Le chapitre 9 introduit les vues génériques mais laisse de côté les détails. Cette annexe décrit chacune des vues générique ainsi que toutes les options quelles peuvent prendre. Assurez vous d’avoir lu le chapitre 9 avant d’essayer de comprendre les références qui suivent. Vous voudrez peut-être revenir aux objets Book, Publisher, et Author défini dans ce chapitre; les exemples qui suivent utilisent ces modèles.
Arguments courants des vues génériques
La plupart de ces vues acceptent un grand nombre d’arguments qui peuvent changer le comportement d’une vue générique. Beaucoup de ces arguments fonctionnent de la même façon dans la plupart des vues. Le tableau D-1 décrit chacun d’entre eux; à chaque fois que vous voyez un de ces arguments dans une liste d’argument de vue générique, elle fonctionnera comme décrit dans le tableau.
Table D-1. Arguments courants des vues génériques
| Argument | Description |
| allow_empty | Un Booléen précisant s’il faut afficher la page s’il n’y a pas d’objet disponible. S’il est fixé à False et qu’aucun objets n’est disponibles, la vue lévera une erreur 404 au lieu d’afficher une page vierge. Par défaut, sa valeur équivaut à False. |
| context_processors | Une liste de processeurs de gabarit contextuel additionnels (conjointement à ceux par défaut) qui applicables au gabarit de la vue. Consultez le chapitre 10 pour plus d’information au sujet des processeurs de gabarit contextuel. |
| extra_context | Un dictionnaire de valeurs à ajouter au contexte du gabarit. Par défaut, il s’agit d’un dictionnaire vide. Si une valeur du dictionnaire est appelable, la vue générique l’appelera juste avant le rendu du gabarit. |
| mimetype | Le type MIME à utiliser pour le document résultant. Il correspond par défaut à la valeur du paramètre DEFAULT_MIME_TYPE, valant text/html si vous ne l’avez pas modifié. |
| queryset | Un QuerySet (c’est à dire quelque chose comme Author.objects.all()) d’où extraire les objets. Lisez l’annexe C pour plus d’information au sujet des objets QuerySet. La plupart des vues génériques impose cet argument. |
| template_loader | Le chargeur de gabarit à utiliser lors du chargement du gabarit. Par défaut, il s’agit de django.template.loader. Liser le chapitre 10 pour en savoir plus au sujet des chargeurs de gabarit. |
| template_name | Le nom complet d’un gabarit à utiliser dans le rendu de la page. Ceci vous permet d’outrepasser le nom du gabarit dérivé du QuerySet par défaut. |
| template_object_name | Le nom de la varible de gabarit à utiliser dans le contexte du gabarit. Par défaut, il s’agit d’``’objet’. Les vues qui listent plus d'un objet (c'est à dire, les vues ``objet_list et diverses vues objects-for-date) ajouterons '_list' à la valeur de ce paramètre. |
Vues génériques «simples»
le module django.views.generic.simple contient de simples vues qui prennent en charge un couple de cas courants: faire le rendu d’un gabarit lorsque aucune logique de vue est nécessaire et gérer une redirection.
Faire le rendu d’un gabarit
fonction de vue: django.views.generic.simple.direct_to_template
Cette vue assure le rendu d’un gabarit donné, lui transmettant une variable de gabarit {{ params }}, qui est un dictionnaire des paramètres capturés dans l’URL.
Exemple
Considérant l’URLConf suivant:
from django.conf.urls.defaults import *
from django.views.generic.simple import direct_to_template
urlpatterns = patterns('',
(r'^foo/$', direct_to_template, {'template':
'foo_index.html'}),
(r'^foo/(?P<id>\d+)/$', direct_to_template, {'template':
'foo_detail.html'}),
)
une requête vers /foo/ générera le rendu du gabarit foo_index.html, et une requête vers /foo/15/ générera le rendu de foo_detail.html avec une variable contextuelle {{ params.id }} fixée à 15.
Arguments requis
- template: le nom complet d’un gabarit à utililser.
Redirection vers un autre URL
fonction Vue: django.views.generic.simple.redirect_to
Cette vue redirige vers un autre URL. L’URL donné peut contenir une chaîne de formattage de style dictionnaire, qui sera interpolée avec les paramètres capturés dans l’URL.
Si l’URL donné vaut None, Django retournera un message HTTP 410 («ressource plus disponible»)
Exemple
Cet URLConf redirige /foo/<id>/ vers /bar/<id>/:
from django.conf.urls.defaults import *
from django.views.generic.simple import redirect_to
urlpatterns = patterns('django.views.generic.simple',
('^foo/(?p<id>\d+)/$', redirect_to, {'url': '/bar/%(id)s/'}),
)
cette exemple renvoi une réponse «ressource plus disponible» pour la requête /bar/:
from django.views.generic.simple import redirect_to
urlpatterns = patterns('django.views.generic.simple',
('^bar/$', redirect_to, {'url': None}),
)
Arguments requis
- url: l’URL à rediriger, sous forme de chaîne. Ou bien None pour renvoyer une reponse HTTP 410 («ressource plus disponible»).
Lister/Détailler les vues génériques
Les vues génériques list/detail (dans le module django.views.generic.list_detail) gèrent le cas classique de fournir une liste d’élément à une vue et … de ces éléments à une autre. FIXME handle the common case of displaying a list of items at one view and individual ?detail? views of those items at another.
Listes d’objects
fonction Vue: django.views.generic.list_detail.object_list
Utilisez cette vue pour afficher une page représentant une liste d’objets.
Exemple
Considérant l’objet Author du chapitre 5, nous pouvons utiliser la vue object_list pour afficher une simple liste de tous les auteurs correspondant à l’extrait d’URLConf suivant:
from mysite.books.models import Author
from django.conf.urls.defaults import *
from django.views.generic import list_detail
author_list_info = {
'queryset' : Author.objects.all(),
'allow_empty': True,
}
urlpatterns = patterns('',
(r'authors/$', list_detail.object_list, author_list_info)
)
Arguments requis
- queryset: un QuerySet d’objets de liste (voir Tableau D-1).
Arguments optionnels
- paginate_by: un entier spécifiant combien d’objets doivent être affiché par page. S’il est précisé , la vue paginera les objets conformément aux nombre paginate_by d’objets par page. La vue attendra soit un paramètre de requête page (via GET) contenant un nombre de page indexé à zéro, soit une variable page spécifiée dans l’URLConf. Lisez la section suivante «Notes sur la pagination».
En complément, cette vue peut prendre n’importe lequel des arguments courants décrit dans le Tabelau D-1:
- allow_empty
- context_processors
- extra_context
- mimetype
- template_loader
- template_name
- template_object_name
Nom de gabarit
Si template_name n’est pas spécifié, cette vue utilisera le gabarit <app_label>/<model_name>_list.html par défaut. L’étiquette de l’application et le nom du modèle sont tous deux dérivés du paramètre queryset. L’étiquette de l’application est le nom de l’application dans lequel est defini le modèle, et le nom du modèle est la version en bas de casse du nom du modèle de classe.
Dans les exemples précédents qui utilisent Author.objects.all() comme queryset, l’étiquette de l’application sera books et le nom de modèle sera author. Cela signifie que le gabarit par défaut sera books/author_list.html.
Contexte de gabarit
En complément à extra_context, le contexte de gabarit contiendra:
- object_list: la liste des objets. Ce nom de variable dépend du paramètre template_object_name, qui est 'object' par défaut. Si le template_object_name est 'foo', le nom de cette variable sera foo_list.
- is_paginated: un Booléen précisant si les résultats doivent être paginés. Plus spécifiquement, sa valeur est à False si le nombre d’objets disponibles est inférieur ou égal à paginate_by.
Si les résultats sont paginés, le contexte contiendra ces variables supplémentaires:
- results_per_page: le nombre d’objet par page. (c’est la même chose que le paramètre paginate_by).
- has_next: un Booléen précisant s’il existe une page suivante.
- has_previous: un Booléen précisant s’il existe une page précédente.
- page: Tle numéro de la page courante, sous forme d’entier. En commençant à 1.
- next: le numéro de la page suivante, sous forme d’entier. S’il n’y en a pas, il restera un entier représentant le numéro théorique de la page suivante. En commençant à 1.
- previous: le numéro de la page précédente, sous forme d’entier. En commençant à 1.
- pages: le nombre total de pages, sous forme d’entier.
- hits: le nombre total d’objets parmis toutes les pages, pas seulement cette page.
Note sur la pagination
Si paginate_by est précisé, Django paginera les résutlats. Vous pouvez spécifier le nombre de page dans l’URL selon l’une de ces deux façons:
en utilisant le paramètre page dans l’URLConf. Par exemple, voici à quoi pourrait ressembler votre URLConf:
(r'^objects/page(?P<page>[0-9]+)/$', 'object_list', dict(info_dict))en passant le nombre de page via le paramètre page de la chaîne de requête. Par exemple, un URL pourrait ressembler à ceci:
/objects/?page=3Dans les deux cas, page commence à 1, pas à 0, la première page sera donc présentée comme étant la page 1.
Les vue détail
fonction Vue: django.views.generic.list_detail.object_detail
Cette vue fourni une vue «detail» d’un unique objet.
Exemple
En poursuivant avec l’exemple object_list précédent, nous pouvons ajouter un détail de vue pour un auteur donnée en modifiant l’URLConf:
from mysite.books.models import Author
from django.conf.urls.defaults import *
from django.views.generic import list_detail
author_list_info = {
'queryset' : Author.objects.all(),
'allow_empty': True,
}
**author_detail_info = {**
**"queryset" : Author.objects.all(),**
**"template_object_name" : "author",**
**}**
urlpatterns = patterns('',
(r'authors/$', list_detail.object_list, author_list_info),
**(r'^authors/(?P<object_id>d+)/$',
list_detail.object_detail, author_detail_info),**
)
Arguments requis
- queryset: un``QuerySet`` qui recherchera l’objet (voir Table D-1).
et soit
- object_id: la valeur du champ de clef primaire de l’objet.
ou
- slug: le slug de l’objet concerné. Si transmettez ce champ, alors l’argument slug_field est aussi requis (consultez la section suivante)s.
Arguments optionnels
- slug_field: le nom du champ de l’objet contenant le slug. Ceci est requis si vous utilisez l’argument slug, mais doit être absent si vous utilisez l’argument object_id.
- template_name_field: le nom d’un champ de l’objet dont la valeur est le nom de gabarit à utiliser. Cela vous permet de stocker les noms de gabarit dans vos données.
En d’autres termes, si votre objet a un champ 'the_template' qui contient la chaîne 'foo.html', et que vous fixiez template_name_field à 'the_template', alors la vue générique pour cet objet utilisera le gabarit 'foo.html'.
Si le gabarit nommé template_name_field n’existe pas, celui nommé template_name est utilisé à la place. C’est un peu casse tête, mais utile dans certain cas.
Cette vue peut aussi prendre ces arguments courants (voir le Tableau D-1):
- context_processors
- extra_context
- mimetype
- template_loader
- template_name
- template_object_name
Nom de gabarit
Si template_name et``template_name_field`` ne sont pas spécifiés, cette vue utilisera le gabarit <app_label>/<model_name>_detail.html par défaut.
Contexte de gabarit
En complément à extra_context, le contexte de gabarit sera ainsi:
- object: l’objet. Le nom de cette variable dépend du paramètre template_object_name, 'object' par défaut. Si template_object_name est 'foo', le nom de cette variable sera foo.
Vues génériques basées sur la date
Les vues génériques basées sur la date sont généralement utilisées pour fournir un jeu de pages d’«archives» pour le contenu daté. Pensez aux archives année/mois/jour d’un journal, ou aux archives typiques d’un blog.
Astuce:
Par défaut, ces vues ignorent les objets proposant des dates futures.
Cela signifie que si vous tentez de consulter une page d’archive dans le futur, Django affichera automatiquement une erreur 404 («Page non trouvée»), même s’il existe des objets publiés à cette date.
Toutefois, vous pouvez publier des objets post-datés qui n’apparaîtrons publiquement qu’au moment de la date de publication désirée.
Cependant, pour différents types d’objets basés sur la date, cela n’est pas approprié (par exemple, un calendrier d’événements à venir). Pour ces vues, fixer l’option allow_future à True fera apparaître les futures objets (et autorisera les utilisateurs à consulter ces pages d’archives «futures»).
Index des archives
Vue: django.views.generic.date_based.archive_index
Cette vue fournit une page d’index général affichant les derniers (c’est à dire, les plus récents) objets par date.
Exemple
Considérons q’un éditeur typique désire une page sur les livres récemments publiés. Avec les objets Book ayant un champ publication_date, nous pouvons utiliser la vue archive_index pour cette tâche courante:
from mysite.books.models import Book
from django.conf.urls.defaults import *
from django.views.generic import date_based
book_info = {
"queryset" : Book.objects.all(),
"date_field" : "publication_date"
}
urlpatterns = patterns('',
(r'^books/$', date_based.archive_index, book_info),
)
Arguments requis
- date_field: le nom du DateField ou du DateTimeField dans le modèle de QuerySet que l’archive basée sur la date doit utiliser pour déterminer les objets sur la page.
- queryset: un QuerySet d’objets pour lesquels sert l’archive.
Arguements optionnels
- allow_future: un Booléen spécifiant s’il faut inclure les «future»s objets dans cette page, comme décrit dans la note précédente.
- num_latest: le nombre des derniers objets à envoyer au contexte de gabarit. Par défaut, c’est 15.
Cette vue peut aussi prendre les arguments courants (voir Tableau D-1):
- allow_empty
- context_processors
- extra_context
- mimetype
- template_loader
- template_name
Nom de gabarit
Si template_name n’est pas spécifiée, cette vue utilisera le gabarit <app_label>/<model_name>_archive.html par défaut.
Contexte de gabarit
En complément à extra_context, le contexte de gabarit sera comme suit:
date_list: une liste d’objets datetime.date représentant toutes les années ayant des objets disponibles conformément à queryset. Ceux-ci sont ordonnés à l’envers.
Par exemple, si vous avez des entrées de blog de 2003 à 2006, cette liste contiendra quatre objets datetime.date: un par année.
latest: les objets num_latest présents dans le système, en ordre décroissant selon le date_field. Par exemple, si num_latest vaut 10, alors latest sera une liste des dix derniers objets dans queryset.
Archive annuelle
Vue: django.views.generic.date_based.archive_year
Utilisez cette vue pour les pages d’archives annuelles. Ces pages propose une liste des mois pour lesquels des objets existent, et peuvent optionnellement afficher tous les objets publiés pour une année donnée.
Exemple
En étendant l’exemple précédent archive_index, nous ajouterons une façon de voir tous les livres publiés pour une année donnée:
from mysite.books.models import Book
from django.conf.urls.defaults import *
from django.views.generic import date_based
book_info = {
"queryset" : Book.objects.all(),
"date_field" : "publication_date"
}
urlpatterns = patterns('',
(r'^books/$', date_based.archive_index, book_info),
**(r'^books/(?P<year>d{4})/?$', date_based.archive_year,
book_info),**
)
Arguments requis
- date_field: comme pour archive_index (voir la section précédente).
- queryset: un QuerySet d’objets pour lesquels sert l’archive.
- year: l’année sur quatre chiffres pour laquelle sert l’archive (comme dans notre exemple, c’est habituellement tiré du paramètre d’URL).
Arguments optionnels
- make_object_list: un Booléen précisant s’il faut récupérer la liste complète des objets pour cette année et transmettre ceux-ci au gabarit. Si True, cette liste d’objets sera rendu disponible au gabarit comme une object_list. (Le nom object_list peut différer; lisez les informations au sujet des object_list dans la section à venir «Contexte de gabarit»). Par défaut, à False.
- allow_future: un Booléen precisant s’il faut inclure les «futur»s objets sur cette page.
Cette vue peut aussi prendre ces arguments (lisez le Tableau D-1):
- allow_empty
- context_processors
- extra_context
- mimetype
- template_loader
- template_name
- template_object_name
Nom de gabarit
Si template_name n’est pas précisé, cette vue utilisera le gabarit <app_label>/<model_name>_archive_year.html par défaut.
Contexte de gabarit
En complément à extra_context, le contexte de gabarit sera ainsi:
date_list: un liste d’objets datetime.date représentant tout les mois qui ont des objets disponibles pour l’année donnée, selon le queryset, en ordre croissant.
year: l’année donnée, sous forme de chaîne à quatre chiffres.
object_list: si le paramètre make_object_list est à True, elle sera fixé en liste des objets disponibles pour l’année donnée, ordonnée selon le champ date. Ce nom de variable dépend du paramètre template_object_name, qui est 'object' par défaut. Si le template_object_name est 'foo', le nom de cette variable sera foo_list.
Si make_object_list est False, object_list sera transmis au gabarit en tant que liste vide.
Archives mensuelles
Vue: django.views.generic.date_based.archive_month
Cette vue fournit les pages d’archives mensuelles affichant tous les objets pour un mois donné.
Exemple
Toujours avec notre exemple, ajouter les vues mensuelles doit vous sembler familier:
urlpatterns = patterns('',
(r'^books/$', date_based.archive_index, book_info),
(r'^books/(?P<year>d{4})/?$', date_based.archive_year,
book_info),
**(**
**r'^(?P<year>d{4})/(?P<month>[a-z]{3})/$',**
**date_based.archive_month,**
**book_info**
**),**
)
Arguments requis
- year: l’année sur quatre chiffrespour lesquelles l’archive sert (une chaîne).
- month: le mois pour lequel l’archive sert, formatté selon l’argument month_format.
- queryset: un QuerySet d’objets pour lequel l’archive sert.
- date_field: le nom du DateField ou DateTimeField dans le modèle de QuerySet que l’archive basée sur la date doit utiliser pour déterminer les objets sur la page.
Arguemnts optionnels
- month_format: une chaîne de formattage qui régule le format utilisé par le paramètre month. Elle doit correspondre à la syntaxe acceptée par time.strftime Python. (Voir la documentation Python sur strftime à l’adresse http://www.djangoproject.com/r/python/strftime/). Elle est fixée à "%b" par défaut, sous forme d’abbrévation du mois sur trois lettres (c’est à dire, «jan», «feb»,etc.). Pour utiliser des nombres, servez vous de "%m".
- allow_future: un Booléen précisant s’il faut inclure les «futur»s objets sur cette page, comme décrit dans la note précédente.
Cette vue peut aussi prendre les arguments courants (voir le Tableau D-1):
- allow_empty
- context_processors
- extra_context
- mimetype
- template_loader
- template_name
- template_object_name
Nom de gabarit
Si template_name n’est pas spécifié, cette vue utilisera le gabarit <app_label>/<model_name>_archive_month.html par défaut.
Contexte de gabarit
En complément à extra_context, le contexte de gabarit sera le suivant:
- month: un objet datetime.date représentant le mois donnée.
- next_month: un objet datetime.date représentant le premier jour du mois suivant. Si le mois suivant est dans le futur, il vaudra None.
- previous_month: un objet datetime.date représentant le premier jour du mois précédent. À l'inverse de ``next_month, ce ne sera jamais None.
- object_list: une liste d’objets disponibles pour le mois donnée. Ce nom de variable dépends du paramètre template_object_name, qui est 'object' par defaut. Si template_object_name est 'foo', le nom de cette variable sera foo_list.
Archives hebdomadaires
Vue: django.views.generic.date_based.archive_week
Cette vue affiche tous les objets d’une semaine donnée.
Note
Pour des raisons de cohérence avec la gestion des primitives date/time en Python, Django considère que le prmeier jour de la semaine est le dimanche.
Exemple
urlpatterns = patterns('',
# ...
**(**
**r'^(?P<year>d{4})/(?P<week>d{2})/$',**
**date_based.archive_week,**
**book_info**
**),**
)
Arguments requis
- year: l’année sur quattre chiffres pour laquelle l’archive sert (une chaîne).
- week: la semaine de l’année pour laquelle l’archive sert (une chaîne).
- queryset: un QuerySet des objets pour lesquels l’archive sert.
- date_field: le nom du DateField ou du DateTimeField dans le modèle du QuerySet que l’archive basée sur la date doit utiliser pour déterminer les objets sur la page.
Arguments optionnels
- allow_future: un Booléen précisant s’il faut inclure les objets «future» sur cette page, comme décrit dans la note précédente.
Cette vue peut aussi prendre les arguments courants (voir le Tableau D-1):
- allow_empty
- context_processors
- extra_context
- mimetype
- template_loader
- template_name
- template_object_name
Nom de gabarit
Si template_name n’est pas spécifié, cette vue utilisera le gabarit <app_label>/<model_name>_archive_week.html par défaut.
Contexte de gabarit
En complément à extra_context, le contexte de gabarit sera le suivant:
- week:un objet datetime.date représentant le premier jour de la semaine donnée.
- object_list: une liste d’objets disponibles pour la semaine donnée. Le nom de cette variable dépends du paramètre template_object_name, qui est par défaut 'object'. Si template_object_name est 'foo', le nom de variable sera foo_list.
Archives journalières
Vue: django.views.generic.date_based.archive_day
Cette vue génére tous les objets d’un jour donné.
Exemple
urlpatterns = patterns('',
# ...
**(**
**r'^(?P<year>d{4})/(?P<month>[a-z]{3})/(?P<day>d{2})/$',**
**date_based.archive_day,**
**book_info**
**),**
)
Arguments requis
- year: l’année sur quatre chiffres pour laquelle sert l’archive (une chaîne).
- month: le mois pour lequel l’archive sert, formatté selon l’argument month_format.
- day:le jour pour lequel sert l’archive, formatté selon l’argument day_format.
- queryset: un QuerySet d’objets pour lesquels l’archive sert.
- date_field: le nom du DateField ou du DateTimeField dans le modèle du QuerySet que l’archive basée sur la date doit utiliser pour déterminer les objets sur la page.
Arguments optionnels
- month_format: une chaîne de formatage qui régule le format qu’utilise le paramètre month. Lisez les explications détaillées de la section «Archives mesuelles» qui précède.
- day_format: tout comme month_format, mais pour le paramètre day. Par défaut à "%d" (le jour du mois sous forme de nombre décimal, 01-31).
- allow_future: un Booléen précisant s’il faut inclure les objets «futur»s sur cette page, comme décrit dans la note précédente.
Cette vie peut aussi prendre les arguments courants (voir Tableau D-1):
- allow_empty
- context_processors
- extra_context
- mimetype
- template_loader
- template_name
- template_object_name
Nom de gabarit
If template_name isn?t specified, this view will use the template <app_label>/<model_name>_archive_day.html by default.
Contexte de gabarit
En complément à extra_context, le contexte de gabarit sera le suivant:
- day: un objet datetime.date representant le jour donné.
- next_day: un objet datetime.date représentant le jour suivant. Si le lendemain est dans le futur, il vaudra None.
- previous_day: un objet datetime.date representant le jour donné. Contrairement à next_day, ce ne sera jamais None.
- object_list: une liste d’objets disponibles pour le jour donné. Le nom de cet variable dépend du paramètre template_object_name, qui est 'object' par defaut. Si template_object_name est 'foo', le nom de cet variable sera foo_list.
Archive du jour
La vue django.views.generic.date_based.archive_today montre tout les objets pour aujourd’hui. C’est exactement la même chose qu’ archive_day, à l’exception des arguments year/month/day qui ne sont pas utilisé, et que la date du jour est utilisé à la place.
Exemple
urlpatterns = patterns('',
# ...
**(r'^books/today/$', date_based.archive_today, book_info),**
)
Pages «détail» basées sur la date
Vue: django.views.generic.date_based.object_detail
Utilisez cette vue pour une page représentant un objet individuel.
Elle possède une URL différente de la vue object_detail; la vue object_detail utilise des URLs du genre /entries/<slug>/, alors que celle-ci utilise des URLs du genre /entries/2006/aug/27/<slug>/.
Note
Si vous utilisez des pages détail basées sur la date avec des slugs dans les URLs, vous voudrez probablement aussi utiliser l’option unique_for_date sur le champ du slug pour valider que ces slugs ne sont pas dupliqués dans une même journée. Lisez l’annexe B pour les détails sur unique_for_date.
Exemple
Celle-ci diffère (légèrement) de tous les autres exemples basés sur la date en ce nous devons fournir soit un ID d’objet ou un slug de façon à ce que Django puisse chercher l’objet en question.
Puisque l’objet que nous utilisons n’a pas de champs slug, nous utiliserons les URLs basés sur l’ID. Utiliser un champ slug est une bonne pratique, mais par soucis de simplicité nous allons laisser faire.
urlpatterns = patterns('',
# ...
**(**
**r'^(?P<year>d{4})/(?P<month>[a-z]{3})/(?P<day>d{2})
/(?P<object_id>[w-]+)/$',**
**date_based.object_detail,**
**book_info**
**),**
)
Arguments requis
- year: l’année de l’objet, sur quatre chiffres (une chaîne).
- month: le mois de l’objet, formatté selon l’argument month_format.
- day: le jour de l’objet, formatté selon l’argument day_format.
- queryset: un``QuerySet`` qui contient l’objet.
- date_field: le nom du DateField ou du DateTimeField dans le modèle de QuerySet que la vue générique doit utiliser pour rechercher l’objet selon year, month, et day.
Vous aurez aussi besoin de:
- object_id: la valeur du champ clef-primaire de l’objet.
ou:
- slug: le slug pour l’objet donnée. Si vous transmettez ce champs, alors l’argument slug_field (décrit dans la section suivante) est aussi requis.
Arguments optionnels
allow_future: Un Booléen précisant s’il faut inclure les objets «future» dans cette page, comme décrit dans la note précedente.
- day_format: comme month_format, mais pour le paramètre day.
Par défaut à "%d" (le jour du mois sous forme de nombre décimal, 01-31).
month_format: une chaîne de formattage qui régule le format utilisé par le paramètre month. Lisez les explications détaillées dans la précedente section «Archives mensuelles».
slug_field: le nom du champ de l’objet contenant le slug. Ceci est requis si vous utilisez l’argument slug, mais peut être omis si vous utilisez l’argument object_id.
template_name_field: le nom d’un champ de l’objet dont la valeur est le nom du gabarit à utiliser. Ceci vous permet de stocker le nom des gabarits dans les données. En d’autres termes, si votre objet à un champ 'the_template' qui contient une chaîne 'foo.html', et que vous fixiez template_name_field à 'the_template', alors la vue générique pour cet objet utilisera le gabarit 'foo.html'.
Cette vue peut aussi prendre les arguments courants (voir Tableau D-1):
- context_processors
- extra_context
- mimetype
- template_loader
- template_name
- template_object_name
Nom de gabarit
Si template_name et template_name_field ne sont pas spécifiés, cette vue utilisera le gabarit <app_label>/<model_name>_detail.html par défaut.
Contexte de gabarit
En complément à extra_context, le contexte de gabarit sera le suivant:
- object: l’objet. Ce nom de varialbe dépend du paramètre template_object_name, qui est 'object' par défaut. Si template_object_name est 'foo', ce nom de variable sera foo.
Créer/Mettre à jour/Supprimer des vues génériques
Le module django.views.generic.create_update contient un jeu de fonctions pour créer, éditer, et effacer des objets.
Note
Ces vues peuvent changer légèrement lorsque la révision de l’architecture des formulaires (actuellement en court de développement sous le nom de django.newforms) sera finalisé.
Ces vues présentent toutes des formulaires si l’on y accède par GET et effectuent l’action désirée (créer/mettre à jour/effacer) si l’on y accède par POST.
Toutes ces vues ont une idée très grossière de la sécurité. Bien qu’elles possèdent un attribut login_required, qui s’il est donné restreindra l’accès au utilisateurs identifiés, cela ne vas pas plus loin. Elles ne vont pas, par exemple, vérifier que l’utilisateur éditant un objet est le même que l’utilisateur qui l’a créé, ou ne vont valider les permissions d’aucune sorte.
La plupart du temps, cependant, ces fonctionnalités peuvent s’accomplir en écrivant un petit emballage autour de la vue générique; lisez «Étendre les vues génériques» du chapitre 9.
Créer des objets vues
Vue: django.views.generic.create_update.create_object
cette vue affiche un formulaire de création d’objet. Lorsque le formulaire est soumis, cette vue réaffiche le formulaire avec les erreurs de validation (s’il y en a) ou sauvegarde l’objet.
Exemple
Si nous avions voulu autoriser les utilisateurs à créer des nouveaux livres dans la base de données, nous aurions pu faire quelque chpse comme ceci:
from mysite.books.models import Book
from django.conf.urls.defaults import *
from django.views.generic import date_based
book_info = {'model' : Book}
urlpatterns = patterns('',
(r'^books/create/$', create_update.create_object, book_info),
)
Arguments requis
- model: le modèle Django de l’objet que le formulaire va créer.
Note
Notez que cette vue prends le modèle à créer, et non pas un QuerySet (comme le font toutes les vues liste/détail/basé sur la date, présentées précédemment).
Arguments optionnels
post_save_redirect: un URL sur lequel la vue sera redirigée après la sauvegarde de l’objet. Par défaut, il s’agit de object.get_absolute_url().
post_save_redirect: peut contenir un dictionnaire de chaîne de formattage, qui sera interpolé sur les attributs de champs d’objets. Par exemple, vous pouvez utiliser post_save_redirect="/polls/%(slug)s/".
login_required: un Booléen désignant si un utilisateur doit être identifié, de façon à voir la page et enregistrer les changements. Il intègre le système d’identifiaction de Django. Par défaut, il est à False.
S’il est à True, et qu’un utilisateur non identifié tente de consulter cette page ou d’enregistrer le formumlaire, Django redirigera la requête vers /accounts/login/.
Cette vue peut aussi prendre les arguments courant (voir Tableau D-1):
- context_processors
- extra_context
- template_loader
- template_name
Nom de gabarit
Si template_name n’est pas précisé, cette vue utilisera le gabarit <app_label>/<model_name>_form.html par défaut.
Contexte de gabarit
En complément à extra_context, le contexte de gabarit sera le suivant:
form: une instance de FormWrapper représentant le formulaire pour éditer l’objet. Cela vous permet de faire référence aux champs de formulaire dans le système de gabarit, aisément - par exemple, si le modèle possède deux champs, name et address:
<form action="" method="post"> <p><label for="id_name">Name:</label> {{ form.name }}</p> <p><label for="id_address">Address:</label> {{ form.address }}</p> </form>Notez que form est un FormWrapper ancienne version, et qu’il n’est pas abordé dans ce livre. Voir http://www.djangoproject.com/documentation/0.96/forms/ pour les détails.
Vue de mise à jour des objets
Vue: django.views.generic.create_update.update_object
Cette vue est à peu de chose prêt identique à la vue de création d’un objet. cepedant, celui-ci permet d’éditer un objet existant au lieu d’en créer un nouveau.
Exemple
En suivant l’exemple préc”dent, nous pouvons fournir une interface d’édition pour un unique livre avec cet extrait d’URLconf:
from mysite.books.models import Book
from django.conf.urls.defaults import *
from django.views.generic. import date_based
book_info = {'model' : Book}
urlpatterns = patterns('',
(r'^books/create/$', create_update.create_object, book_info),
**(**
**r'^books/edit/(?P<object_id>d+)/$',**
**create_update.update_object,**
**book_info**
**),**
)
Arguments requis
- model: le modèle Django à éditer. Encore une fois, il s’agit du modèle actuel lui même, et non pas d’un QuerySet.
Et soit:
- object_id: la valeur du champ de clef-primaire pour l’objet.
ou:
- slug: le slug pour un objet donné. Si vous négligez ce champ, alors l’argument slug_field ci-dessous est aussi requis.
Arguments optionnels
- slug_field: le nom du champ sur l’objet contenant le slug. Cela est requis si vous utilisez l’argument slug, mais doit être absent si vous utilisez l’argument object_id.
En complément, cette vue accepte tous les mêmes arguments optionnels que la création d’une vue, plus l’argument commun template_object_name du tableau D-1.
Nom de gabarit
Cette vue utilise le même gabarit par défaut (<app_label>/<model_name>_form.html) que la vue création.
Contexte de gabarit
En complément à extra_context, le contexte de gabarit sera le suivant:
- form: A FormWrapper instance representing the form for editing the object. See the ?Create Object View? section for more information about this value.
- object: The original object being edited (this variable may be named differently if you?ve provided the template_object_name argument).
Delete Object View
Vue: django.views.generic.create_update.delete_object
Cette vue est très similaire aux deux autres vues «créer/modifier». Cette vue, cependant, autorise la suppression des objets.
Si cette vue est appelé par GET, elle affichera une page de confirmation (c’est à dire, «Voulez-vous réellement supprimer cet objet ?»). Si la vue est soumise avec un POST, l’objet sera éffacé sans confirmation.
Tous les arguments sont les même que pour la vue de mise à jour d’un objet, tout comme le contexte; le nom de gabarit pour cette vue est <app_label>/<model_name>_confirm_delete.html.
Dernière modification: 2008-08-04 13:38:34.426903