У меня есть две модели:Сохранить новый внешний ключ с формой Джанго
class Studio(models.Model):
name = models.CharField("Studio", max_length=30, unique=True)
class Film(models.Model):
studio = models.ForeignKey(Studio, verbose_name="Studio")
name = models.CharField("Film Name", max_length=30, unique=True)
У меня есть форма пленки, которая позволяет пользователю выбрать либо существовавшие ранее Studio, или введите новый:
class FilmForm(forms.Form):
studio = forms.ModelChoiceField(Studio.objects, required=False)
new_studio = forms.CharField(max_length=30, required=False, label = "New Studio Name")
name = forms.CharField(max_length=30, label = "Film Name")
Существует подтверждение, чтобы имя new_studio еще не было. Если пользователь вводит новый_студий, я хочу сохранить студию, а затем сохранить новый фильм.
form = FilmForm(request.POST)
if form.is_valid(): # All validation rules pass
std = Studio(name = form.cleaned_data['new_studio'])
std.save()
Но как же сохранить экземпляр фильма в соответствии с новым номером студии? Я видел this question, но что, если у меня есть еще много полей в модели фильма и в форме фильма? Если я использую связанный ответ, мне нужно будет указать каждое поле:
studio = Studio.objects.get(name=request.POST['new_studio'])
newFilm=Film(name=form.name, studio=studio, field_one = form.field_one, field_two = form.field_two, etc.)
Каков правильный способ его реализации?
ох, хм. Ницца! Я думал, что мне нужно пройти долгий путь, чтобы компенсировать возможность добавления новой студии. Благодаря! –
У меня есть один вопрос.Я создал проверку проверки для дублированной студии (если пользователь вводит новый_студий, который уже существует). Код правильно достигает ValidationError, но, похоже, продолжает очищаться и дает мне ошибку: нельзя назначить None: «Film.studio» не разрешает нулевые значения. –
«Чистый» метод позаботится обо всем этом. Если существует 'new_studio', он просто получит существующую студию вместо фактического создания нового (' get_or_create'), поэтому проверка проверки вам не нужна. Единственный случай, не описанный выше методом 'clean', заключается в том, что введена' studio', но 'new_studio' - нет. Однако это не будет ошибкой, и в этом сценарии не должно быть ничего особенного. Я предполагаю, что любая проверка проверки, которую вы делаете, как-то возится со значениями. –