开发者

merge 2 django (very similar) urlconfs in one

I have an app called "products" that manages "products" and "categories". And I have products/views.py (with generic views) that goes like this:

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

and something like this:

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

and then my project urls.py is something like this:

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'}),
开发者_开发技巧)

and then I have the two urls.py for category and product like this:

1) products/product_urls.py

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

2) and a very similar line in products/category_urls.py

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

As you can see, products/product_urls.py and products/category_urls.py are really very similar except for the url names.

My question is: is there a smart technique to "merge" products/product_urls.py and products/category_urls.py into a single module and still have different names for the urls depending on the "object" they're working on. i.e. have a single products/urls.py that'll manage both objects: product and category


You can maybe include the same url module twice, but use namespaced urls!


To me, this seems obvious:

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'),
)

The url function only differs from the tuple approach in that you can use keyword args (like name) in it.

Your code seems like it would break if you were to really try it verbatim. This, along with the perceived obviousness, makes me wonder if your actual use case is more complicated and requires a different answer.

Furthermore, the object-list generic view already employs the functionality you're trying to create with your Objects approach. (See the queryset argument; also, create-object's form_class arg). An example:

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'),
)
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜