Я в основном строю очень тривиальную форму. Давайте придерживаться примеров книг / издателей, приведенных в руководствах по 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 ( ) сразу?