2012-01-25 24 views
1

形成:私は、ユーザーを許可するフィルム状を持っては、私は二つのモデル持っ

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を削除

+0

この行が意味することを確認してください: 'studioがNoneでnew_studio == '':'ならば。スタジオは '' ''またはnew_studioを '' None''にできますか?あなたが 'もしそうでなければ(studioまたはnew_studio):'に変更すれば、フォームエラーを正しく表示しますか? – AdamKG

+0

私は、ValidationErrorの直前に "ここ"という印を付けました。それは端末で出てきたので、コードがその部分に到達していることが確認できます。私はあなたが示唆した基準を変更しようとしましたが、同じエラーが発生しました –

+0

トレースバックをペーストできますか? – AdamKG

答えて

2

new_studioのpresavingを防ぐことにFYI
if not studio and not new_studio: 
     del cleaned_data['studio'], cleaned_data['new_studio'] 
     raise forms.ValidationError("Must specify either Studio or New Studio!") 
+0

に入ります。これは機能します。フォームの残りの部分が完全に検証される前にnew_studioが作成されるのを防ぐ方法についての入力はありますか? new_studioを入力してフィルム名を省略すると、名前が必要なのでフォームは通過しませんが、new_studioは作成されます。 –

+0

'elif'をより具体的に変更することができます。 ** studio **と** film **が 'cleaned_data'にあることを確認し、すべてが有効である場合にのみ新しいStudioを作成してください。 – rockingskier

1

新しい形でデフクリーン: デフクリーン(自己): cleaned_data = self.cleaned_data スタジオ= cleaned_data.get( 'スタジオ')

01:

if not studio and not new_studio: 
     del cleaned_data['studio'], cleaned_data['new_studio'] 
     raise forms.ValidationError("Must specify either Studio or New Studio!") 
    elif not studio: 
     del cleaned_data['studio'] 

    return super(FilmForm,self).clean() 

とビューでnew_studio = cleaned_data.get( 'new_studio')

関連する問題