объединить 2 django (очень похожие) urlconfs в один - PullRequest
0 голосов
/ 13 ноября 2010

У меня есть приложение под названием "продукты", которое управляет "продуктами" и "категориями". И у меня есть 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) 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 действительно очень похожи, за исключением имен URL.

У меня вопрос: есть ли умная техника для «объединения» products / product_urls.py и products / category_urls.py в один модуль, и при этом все еще имеют разные имена для URL-адресов в зависимости от «объекта», над которым они работают , т.е. есть один products / urls.py, который будет управлять обоими объектами: продуктом и категорией

Ответы [ 2 ]

0 голосов
/ 13 ноября 2010

Мне это кажется очевидным:

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 отличается от подхода с кортежами только тем, что в нем можно использовать ключевые аргументы (например, name).

Ваш код кажется сломанным, если бы вы действительно попробовали его дословно. Это, наряду с очевидной очевидностью, заставляет меня задуматься о том, является ли ваш фактический вариант использования более сложным и требует другого ответа.

Более того, универсальное представление списка объектов уже использует функциональность, которую вы пытаетесь создать с помощью подхода Objects. (См. Аргумент queryset; также, create-object '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'),
)
0 голосов
/ 13 ноября 2010

Возможно, вы можете включить один и тот же модуль URL дважды, но используйте пространства имен URL !

...