Django DRY URL для доступа к модели - PullRequest
2 голосов
/ 17 декабря 2009

Версия Reader's Digest: Как получить данные (либо одну строку, если указана, либо полную таблицу) из модели, взяв аргумент URL-адреса имени модели без жесткого кодирования URLconfs для соответствия каждой модели? Для более подробной информации читайте дальше:

Я делаю приложение, которое имеет три модели, и я хочу сделать простое представление, которое принимает имя модели, и выкладывает из менеджера модели по умолчанию Model.manager.all(), и, если есть слаг, соответствие одного объекта этот слизень Я не знаю, как это сделать, поэтому я сталкиваюсь с проблемами, связанными с необходимостью создания views / URLconfs для КАЖДОЙ модели по отдельности.

Вот как выглядят URLconfs:

(r'^model1/$', 'model1_index_view', 'model1_index'),
(r'^model1/(?P<slug>[-\w]+)/$', 'model1_detail_view', 'model1_detail'),
(r'^model2/$', 'model2_index_view', 'model2_index'),

Это продолжается немного дольше, но я думаю, вы понимаете. Я заканчиваю жестко кодировать относительно большое количество URLconfs, чтобы сделать что-то, что, я думаю, я могу сделать, возможно, с одним View, который принимает имя модели в качестве аргумента и, возможно, слаг. Меня беспокоит, что произойдет, если кто-то укажет название модели, скажем ... пользователь? Есть ли фрагмент кода, чтобы получить список моделей из приложения и убедиться, что он соответствует одному из них, а не модели из contrib.auth или другого приложения?

1 Ответ

8 голосов
/ 17 декабря 2009

Используйте get_model:

from django.db.models import get_model

def my_view(request, model_name, item_slug):
    try:
        model = get_model('app_name', model_name)
    except:
        ## throw an error
        pass
    objects = model.objects.get(slug=item_slug)

Тогда в URL:

 (r'^(?P<model_name>[-\w]+/(?P<slug>[-\w]+)/$', 'model_detail_view', 'model_detail'),
...