Django: Передача данных для просмотра из диспетчера URL без включения данных в URL? - PullRequest
8 голосов
/ 17 января 2011

Я настроен на динамическое создание URL-адресов в Django на основе имен, хранящихся в объектах базы данных. Все эти страницы должны обрабатываться одним и тем же представлением, но я бы хотел, чтобы объект базы данных передавался представлению в качестве параметра при его вызове. Это возможно?

Вот код, который у меня сейчас есть:

places = models.Place.objects.all()
for place in places: 
    name = place.name.lower()
    urlpatterns += patterns('',
        url(r'^'+name +'/$', 'misc.views.home', name='places.'+name)
    )

Можно ли передать дополнительную информацию в представление, не добавляя дополнительные параметры в URL? Поскольку URL-адреса относятся к корневому каталогу, и мне все еще нужно 404 страницы для отображения других значений, я не могу просто использовать строковый параметр. Является ли решение отказаться от попытки добавить URL-адреса в корневой каталог, или есть другое решение?

Полагаю, я мог бы выполнить поиск по самому имени, так как все URL-адреса должны быть уникальными в любом случае. Это единственный другой вариант?

Ответы [ 2 ]

21 голосов
/ 17 января 2011

Я думаю, что вы можете передать словарь в представление с дополнительными атрибутами , например:

url(r'^'+name +'/$', 'misc.views.home', {'place' : place}, name='places.'+name)

И вы можете изменить представление, чтобы ожидать этот параметр.

20 голосов
/ 17 января 2011

Как правило, это плохая идея, поскольку она будет запрашивать базу данных для каждого запроса, а не только для запросов, относящихся к этой модели.Лучшая идея состоит в том, чтобы придумать общую композицию URL и использовать один и тот же вид для всех них.Затем вы можете извлечь соответствующее место внутри представления, которое попадет в базу данных, только когда вы достигнете этого конкретного представления.

Например:

urlpatterns += patterns('',
    url(r'^places/(?P<name>\w+)/$', 'misc.views.home', name='places.view_place')
)

# views.py
def home(request, name):
    place = models.Place.objects.get(name__iexact=name)
    # Do more stuff here

Я понимаю, что это не то, что вы действительнопросил, но должен дать вам гораздо меньше головной боли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...