0

我有一个名为“产品”的应用程序,用于管理“产品”和“类别”。我有 products/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) 产品/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 非常相似,除了 url 名称。

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

4

2 回答 2

0

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'),
)
于 2010-11-13T16:38:46.497 回答
0

您可能可以两次包含相同的 url 模块,但使用命名空间 urls

于 2010-11-13T12:50:51.760 回答