合并2 django(非常相似)urlconfs合二为一

时间:2010-11-13 11:26:38

标签: django url urlconf

我有一个名为“产品”的应用程序来管理“产品”和“类别”。我有product / views.py(带有通用视图),如下所示:

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

等等:

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

然后我的项目urls.py是这样的:

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

然后我有两个urls.py用于类别和产品,如下所示:

1)products / product_urls.py

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

2)和products / category_urls.py

中非常相似的一行
urlpatterns = patterns('',
    url(r'^$',    'products.views', name='categories-list'),
)

如您所见,除了网址名称外,products / product_urls.py和products / category_urls.py非常相似。

我的问题是:是否有一种智能技术可以将products / product_urls.py和products / category_urls.py“合并”到一个模块中,并且仍然根据他们正在处理的“对象”具有不同的URL名称。即拥有单个产品/ urls.py,它们将管理两个对象:产品和类别

2 个答案:

答案 0 :(得分:0)

您可以包含相同的网址模块两次,但请使用namespaced urls

答案 1 :(得分:0)

对我而言,这似乎很明显:

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

url函数与元组方法的区别仅在于您可以在其中使用关键字args(如name)。

如果您要逐字逐句地尝试,您的代码似乎会破裂。这与感知的显而易见性一起使我想知道您的实际用例是否更复杂并且需要不同的答案。

此外,object-list generic view已经使用了您尝试使用Objects方法创建的功能。 (请参阅queryset参数;另请参阅create-object' s form_class arg)。一个例子:

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