2009-07-09 9 views
1

私はPOSTからのデータを取得し、この標準のスニペットを経由して、それを検証:変更データは

entry_formset = EntryFormSet(request.POST, request.FILES, prefix='entries') 
if entry_formset.is_valid(): 
    .... 

EntryFormSetのModelFormサブクラスは、テキストフィールドを提示する外部キーフィールドウィジェットを上書きします。これにより、ユーザーは既存のキー(Ajaxライブ検索を介して提案)を入力するか、シームレスに追加される新しいキーを入力することができます。

私はこのtry-exceptブロックを使用してオブジェクトがすでに存在するかどうかをテストし、存在しない場合は追加します。

entity_name = request.POST['entries-0-entity'] 
try: 
    entity = Entity.objects.get(name=entity_name) 
except Entity.DoesNotExist: 
    entity = Entity(name=entity_name) 
    entity.slug = slugify(entity.name) 
    entity.save() 

はしかし、私はすぐに戻ってentry_formsetにそのentityを取得する必要があります。 entries-0-entityは文字列であると考えています。 entry_formsetの値に直接アクセスして、代わりにオブジェクト参照を取得するにはどうすればよいですか?

+0

質問は不明です。 2番目のコードスニペットはどこで起こりますか?もっと多くのあなたの意見を投稿したなら、おそらく助けになるでしょう。 –

+0

2番目のスニペットは 'if entry_formset.is_valid()'ブロック内で直接発生します。 –

+1

あなたの質問とは無関係ですが、Entity.objects.get_or_create(name = entity_name)を使用しない理由は何ですか? –

答えて

2

データに応じて表示ウィジェットをカスタマイズできるように、フォームセットのヘルパーファクトリ関数を作成することをお勧めします。以下のような何か:

def make_entry_formset(initial_obj=None, custom_widget=forms.Textarea): 
    # these will be passed as keyword arguments to the ModelChoiceField 
    field_kwargs={'widget': custom_widget, 
        'queryset': Entity.objects.all()} 
    if initial_obj is not None: 
     field_kwargs.update({'initial': initial_obj}) 
    class _EntryForm(forms.ModelForm): 
     entity = forms.ModelChoiceField(**field_kwargs) 

     class Meta: 
      model = Entry 
    return modelformset_factory(Entry, form=_EntryForm) 

次に、あなたのビューコードにあなたがしたいウィジェットを指定し、初期Entityオブジェクトにバインドするかどうかをすることができます。あなたは(is_valid()ブロックの後に)再びそれをレンダリングしたい場合はEntityオブジェクトとその後

formset_class = make_entry_formset(custom_widget=forms.Textarea) 
entry_formset = formset_class() 

:あなただけTextareaウィジェットなし最初の選択をしたいフォームセットの最初のレンダリングのために、あなたはこれを使用することができます

formset_class = make_entry_formset(initial_obj=entity, 
            custom_widget=forms.HiddenInput) 
entry_formset = formset_class(request.POST, request.FILES) 

あなたはもちろん、あなたが好きなウィジェットを使用することができますが、HiddenInputを使用すると、あなたがにバインドするように見えるた(このフィールドとの相互作用から、エンドユーザーを防止するであろう:すでに定義されて、あなたはこれを使用することができますあなたが調べた変数entity)。

関連する問題