2010-11-13 11 views
0

J'ai une application appelée "produits" qui gère "produits" et "catégories". Et j'ai des produits/views.py (avec vues génériques) qui va comme ceci:fusionner 2 django (très similaire) urlconfs en un

Objects = { 
    'products': {'model':Product, 'form':ProductForm} 
    'categories': {'model':Category, 'form':CategoryForm} 
} 

et quelque chose comme ceci:

def list(request, obj): 
    model = Objects[obj]['model'] 
    queryset = model.objects.all() 
    return object_list(request, queryset=queryset) 

puis est quelque chose comme mon projet urls.py ceci:

from django.conf.urls.defaults import * 

urlpatterns = patterns('', 
    (r'^products/',  include('products.product_urls.py'), {obj:'product'}), 
    (r'^categories/', include('products.category_urls.py'), {obj:'category'}), 
) 

puis j'ai les deux urls.py pour la catégorie et produit comme celui-ci:

1) produits/pro duct_urls.py

urlpatterns = patterns('', 
    url(r'^$', 'products.views', name='products-list'), 
) 

2) et une très similaire ligne dans les produits/category_urls.py

urlpatterns = patterns('', 
    url(r'^$', 'products.views', name='categories-list'), 
) 

Comme vous pouvez le voir, les produits/product_urls.py et produits/category_urls.py sont vraiment très similaires sauf pour les noms d'URL. Ma question est: existe-t-il une technique intelligente pour "fusionner" les produits/product_urls.py et products/category_urls.py dans un seul module et ont toujours des noms différents pour les urls en fonction de l '"objet" qu'ils travaillent sur. c'est-à-dire avoir un seul produit/urls.py qui gère les deux objets: produit et catégorie

Répondre

0

Vous pouvez peut-être inclure le même module url deux fois, mais utilisez namespaced urls!

0

Pour moi, cela semble évident:

from django.conf.urls.defaults import * 

urlpatterns = patterns('', 
    url(r'^products/$', 'products.views.list', {'obj':'product'}, name='products-list'), 
    url(r'^categories/$', 'products.views.list', {'obj':'category'}, name='categories-list'), 
) 

La fonction url ne diffère de l'approche tuple que vous pouvez utiliser args mot-clé (comme name) en elle.

Votre code semble comme il se casserait si vous deviez vraiment l'essayer mot pour mot. Ceci, avec l'évidence perçue, me fait me demander si votre cas d'utilisation réel est plus compliqué et nécessite une réponse différente.

En outre, le object-list generic view utilise déjà la fonctionnalité que vous essayez de créer avec votre approche Objects. (Voir l'argument queryset; aussi, create-objectform_class arg). Un exemple:

from django.conf.urls.defaults import * 
from models import Product, Category 
from django.views.generic.list_detail import object_list 

urlpatterns = patterns('', 
    url(r'^products/$', 
     object_list, 
     {'queryset': Product.objects.all()}, 
     name='products-list'), 
    url(r'^categories/$', 
     object_list, 
     {'queryset': Category.objects.all()}, 
     name='categories-list'), 
)