形成:私は、ユーザーを許可するフィルム状を持っては、私は二つのモデル持っ
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)
をどちらかearlier questionからの助けを借りて、新しいものでは既存のメーカー、またはタイプを(選択します:
class FilmForm(forms.ModelForm):
required_css_class = 'required'
studio = forms.ModelChoiceField(Studio.objects, required=False, widget = SelectWithPlus)
new_studio = forms.CharField(max_length=30, required=False, label = "New Studio Name", widget = DeSelectWithX(attrs={'class' : 'hidden_studio_field'}))
def __init__(self, *args, **kwargs):
super(FilmForm, self).__init__(*args,**kwargs)
self.fields['studio'].required = False
def clean(self):
cleaned_data = self.cleaned_data
studio = cleaned_data.get('studio')
new_studio = cleaned_data.get('new_studio')
if not studio and not new_studio:
raise forms.ValidationError("Must specify either Studio or New Studio!")
elif not studio:
studio, created = Studio.objects.get_or_create(name = new_studio)
self.cleaned_data['studio'] = studio
return super(FilmForm,self).clean()
class Meta:
model = Film
さて、私の最初の問題は、スタジオとnew_studio両方がを欠落しているとき、私はジャンゴとValueErrorを得ることです:Noneを代入することはできません:「Film.studioは」null値の誤差を許可していません私はキャプチャしたと思いましたすべてのエラー、したがってdjangoはFilm.studioが空であることを理解するためにはこれまでにないはずです。
2番目の問題は操作の順序です。 FilmFormの残りの部分が有効であると確信した後でnew_studioを保存したい場合はどうすればいいですか?(完全なFilmエントリが保存される前に、 new_studioがフォームのクリーニングに保存されているため、私は明確になっていますか、早すぎる節約の危険がありますか?
編集:Tracebackを追加し、編集した検証if文スタジオとcleaned_dataからnew_studioを削除
この行が意味することを確認してください: 'studioがNoneでnew_studio == '':'ならば。スタジオは '' ''またはnew_studioを '' None''にできますか?あなたが 'もしそうでなければ(studioまたはnew_studio):'に変更すれば、フォームエラーを正しく表示しますか? – AdamKG
私は、ValidationErrorの直前に "ここ"という印を付けました。それは端末で出てきたので、コードがその部分に到達していることが確認できます。私はあなたが示唆した基準を変更しようとしましたが、同じエラーが発生しました –
トレースバックをペーストできますか? – AdamKG