2009-03-24 6 views
2

J'ai le code dans mon urls.py pour mes vues génériques;Spécification de différents noms de modèles dans les vues génériques Django

infodict = { 
'queryset': Post.objects.all(), 
'date_field': 'date', 
'template_name': 'index.html', 
'template_object_name': 'latest_post_list', 
} 

urlpatterns += patterns('django.views.generic.date_based', 
(r'^gindex/$', 'archive_index', infodict), 
) 

va donc à l'adresse/gindex/utilisera une vue générique avec le modèle de « index.html ».

Mais étant donné que j'aurai des vues plus génériques dans cet urlpattern, comment suis-je censé fournir un nom de modèle différent en utilisant le même infodict? Je ne veux pas utiliser beaucoup d'infodits et je ne peux pas utiliser le nom de modèle par défaut.

Veuillez noter que ceci s'applique également au nom d'objet de modèle dans infodict.

Merci pour votre aide!

Modifier: Ceci est l'une de mes premières questions sur stackoverflow et je suis étonné par les réponses approfondies! Je préfère utiliser le constructeur dict que je ne connaissais pas. Je trouve l'utilisation de la documentation python un peu plus difficile car je ne trouve pas ce que je cherche habituellement!

Merci encore pour toutes les réponses et les différentes approches.

Répondre

8

Utilisez le constructeur dict():

infodict = { 
    'queryset': Post.objects.all(), 
    'date_field': 'date', 
    'template_name': 'index.html', 
    'template_object_name': 'latest_post_list', 
} 

urlpatterns = patterns('django.views.generic.date_based', 
    url(r'^gindex/$', 'archive_index', dict(infodict, template_name='gindex.html')), 
    url(r'^hindex/$', 'archive_index', dict(infodict, template_name='hindex.html')), 
) 
+0

+1 de plus en ligne avec ce qui était demandé. –

1

Si vous souhaitez fournir différents noms de modèles à différentes vues, il est en effet courant de transmettre un dictionnaire unique à chaque modèle d'URL. Par exemple:

urlpatterns = patterns('', 
    url(r'^home/$', 'my.views.home', {'template_name': 'home.html'}, name='home'), 
    url(r'^about/$', 'my.views.about', {'template_name': 'about.html'}, name='about'), 
) 

Ce genre de modèle est commune et acceptable.

+0

-1 Cela ne répond pas à la question.Si l'infodict a cinq ou six éléments, auriez-vous vraiment dupliquer tous les paramètres communs à travers chaque URL dans des dictionnaires séparés? Je ne le ferais certainement pas. –

+0

Pour la lisibilité, je pourrais; surtout si ces arguments sont susceptibles de changer à l'avenir. –

+0

Assez juste; le code fonctionne, en rétractant -1. –

0

pas aussi simple, mais peut-être utile si vous avez beaucoup de différents modèles correspondant à la même vue:

base_dict={ 
... 
#defaults go here 
} 
def make_dict(template_name,template_object_name): 
    base_dict.update({ 
     'template_name':template_name, 
     'template_object_name':template_object_name, 
    }) 
    return base_dict 

urlpatterns += patterns('django.views.generic.date_based', 
(r'^gindex/$', 'archive_index', make_dict('index1.html','latest_poll_list')), 
(r'^hindex/$', 'archive_index', make_dict('index2.html','oldest_poll_list')), 
) 

Pour beaucoup de vues génériques similaires, cela va condenser votre code appelle un petit peu, au détriment d'un peu de transparence. Si vous avez plusieurs lignes personnalisant les mêmes paramètres, cela peut être plus facile à lire. Enfin, si la totalité ou la plupart de vos vues requièrent certaines des mêmes informations, mais pas toutes, n'oubliez jamais l'utilité de context processor. Cela prend seulement un peu plus de travail que les solutions ci-dessus, mais il va beaucoup mieux, car il garantit que (sauf si vous utilisez le raccourci render_to_response sans le mot-clé RequestContext) les valeurs par défaut seront toujours disponibles pour votre template. votre vue ou l'url conf change.

+0

-1 Le code "mise à jour" ne fonctionnera pas; L'as tu essayé? dict.update() ne renvoie pas le dict mis à jour, il met à jour le dict "en place" et renvoie None. Et l'autre solution est la verbosité inutile où vous pourriez simplement utiliser dict (infodict, blah = "blah"). –

+0

Vous avez raison. Cependant, je pense que l'exemple verbeux pourrait être plus agréable si vous aviez beaucoup de modèles à faire correspondre. Mais probablement pas aussi utile. –

0

Vous pouvez définir des fonctions de vue wrapper pour paramétrer des vues génériques. Dans votre urls.py ajouter modèle

url(r'^/(?P<tmpl_name>\w+)/$', 'my.views.datebasedproxy') 

dans votre views.py ajouter la fonction vue

def datebasedproxy(request, tmpl_name): 
    return django.views.generic.date_based(request,otherparameters, 
    template_name=tmpl_matrix[tmpl_name]) 

où tmpl_matrix est la liste qui correspond hypothético nom de fichier modèle avec le paramètre et otherparameters se tient pour d'autres articles de dictionnaire requis pour date_based fonction

Questions connexes