Django ModelForm, имеющий внешний ключ в качестве скрытого поля - PullRequest
3 голосов
/ 30 ноября 2009

Я в основном строю очень тривиальную форму. Давайте придерживаться примеров книг / издателей, приведенных в руководствах по django, и опираться на них.

У меня есть логин пользователя для веб-приложения, после чего первое, что он может сделать, - это нажать на издателя. Этот издатель затем сохраняется для своей сессии. После этого я беру их в форму создания книги. Там я вставляю идентификатор издателя из базы данных в скрытое поле.

Когда пользователь отправляет HTTP POST, я делаю что-то вроде:

mybookform = BookForm(request.POST)
if mybookform.is_valid():
    abook = mybookform.save(commit=False)
    abook.publisher_id = request.POST['publisher_id']
    mybookform.save()

Да, здесь есть несколько наивных вещей, таких как слепой захват значения publisher_id и проверка, действительно ли это настоящий идентификатор издателя, среди других проблем безопасности. Давайте просто не будем обращать на это внимание на данный момент.

Мой вопрос: есть ли лучший способ справиться с этим? Хотя гипотетически этот пример не имеет логистического смысла, в моем конкретном приложении этот пример действительно имеет смысл. Проблема в том, что я получаю исключение ValueError, говорящее, что publisher_id должен быть экземпляром Publisher.

Теперь я могу легко получить экземпляр издателя с помощью Publisher.objects.filter (id = ..) и использовать его вместо этого. Вопрос в том, действительно ли это необходимо? Можно ли избежать дополнительного запроса к базе данных и каким-то образом обновить этот экземпляр формы более «элегантным» способом?

Также возможно ли как-то встроить издателя в скрытое поле, чтобы мне не нужно было делать mybookform.save (commit = False) и просто делать mybookform = BookForm (request.POST), а затем mybookform.save ( ) сразу?

Ответы [ 2 ]

1 голос
/ 22 декабря 2011

Нет лучшего способа сделать это.

Для этого я бы использовал функцию get_object_or_404 .

И да, вы можете предотвратить изменение этого пользователем, установив для поля модели значение editable = False ,

1 голос
/ 30 ноября 2009

Получение экземпляра издателя защищает от изменений на стороне клиента, которые могут ссылаться на совершенно недействительного издателя.

На ваш второй вопрос, да, вы можете включить это поле в качестве скрытого поля путем переопределения поля в ModelForm с полем формы approriate, установив widget в HiddenInput .

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