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