Django DRY URL для доступа к модели

Версия 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 ответ

Решение

Используйте 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'),
Другие вопросы по тегам