1

インストールされたアプリケーションの設定フォルダーをスキャンし、設定ファイルをスキャンし、最後に ModelForms をスキャンすることで機能する設定インターフェイスを作成しています。

私は今、最後のステップにいます。フォームは適切に検出されて読み込まれますが、ここで初期データを提供する必要があります。初期データはデータベースから取得する必要があり、ご想像のとおり、(request.user.id を介して) 認証されたユーザーに限定する必要があります。

これはすべて動的に行われることに注意してください。何の名前も、それらの構造も高度に知られていません (退屈な設定インターフェイスを維持したくありません)。

設定フォームの例を次に示します。モデルと、ユーザーが編集できるフィールドを選択するだけです (これは、設定インターフェイスを維持したい範囲です)。

class Set_Personal_Info(forms.ModelForm):
    class Meta:
        model = UserProfile
        fields = ('nick_name', 'url')

私がやりたいことをほぼ実行するmodelformset_factoryを見てきましたが、2つ以上の結果でしか機能しないようです。(ここで、objは設定フォームの 1 つです)

Formset = modelformset_factory(obj.Meta.model, form=obj)
Formset(queryset=obj.Meta.model.objects.filter(id=request.user.id))

データをフィルター処理できません。結果を 1 つだけ取得する必要があります。残念ながら get() は使えません

Formset = modelformset_factory(obj.Meta.model, form=obj)
Formset(queryset=obj.Meta.model.objects.get(id=request.user.id))

「ユーザー」オブジェクトには「順序付けられた」属性がありません

クエリ結果を初期データとして提供しても、リストではないため機能しません。

Formset = modelformset_factory(obj.Meta.model, form=obj)
Formset(initial=obj.Meta.model.objects.get(id=request.user.id))

「ユーザー」オブジェクトはインデックス作成をサポートしていません

答えは目の前にあるような気がします。データベースからデータベースを引き出して、初期値としてフォームに押し込むにはどうすればよいですか?

4

2 に答える 2

3

あなたがやろうとしていることを私が理解しているかどうかはよくわかりません.1つのフォームに興味があるだけなら、なぜフォームセットに関与しているのかわかりません.

モデルフォームにデータベースからの初期データを入力するには、インスタンス引数を渡すだけです。

my_form = Set_Personal_Info(instance=UserProfile.objects.get(id=request.user.id))

Django が新しいインスタンスを作成するのではなく、既存のインスタンスを更新するように、POST でフォームをインスタンス化するときにインスタンス引数も渡すことを忘れないでください。

(オブジェクトにもっと良い名前を付けることを考えたいかもしれないことに注意してください。obj通常、フォームではなくモデルインスタンスを記述しますform。フォームクラスは、PEP8 に従う必要があり、おそらく「フォーム」という単語を含める必要があります-PersonalInfoFormいい名前でしょう。)

于 2012-07-15T17:47:14.120 に答える
0

私が理解したことに基づいて...動的フィールドを含むフォームを生成したい場合は、これを使用できます:

クラス MyModelForm(forms.ModelForm):

def __init__(self, dynamic_fields, *args, **kwargs):
    super(MyModelForm, self).__init__(*args, **kwargs)

    self.fields = fields_for_model(self._meta.model, dynamic_fields, self._meta.exclude, self._meta.widgets)

    class Meta:
        model = MyModel

dynamic_fields はタプルです。

動的フォームの詳細:

  1. http://www.rossp.org/blog/2008/dec/15/modelforms/
  2. http://jacobian.org/writing/dynamic-form-generation/
  3. http://dougalmatthews.com/articles/2009/dec/16/nicer-dynamic-forms-django/

また、ダニエルのアプローチは有効でクリーンです...さまざまなID/タイプなどに基づいて、さまざまなフォームオブジェクトを使用できます

フォーム.py

クラス MyModelFormA(forms.ModelForm):

class Meta:
    model = MyModel
    fields = ('field_a','field_b','field_c')
     class MyModelFormB(forms.ModelForm):

class Meta:
    model = MyModel
    fields = ('field_d','field_e','field_f')

ビュー.py

request.method == 'POST' の場合:

if id == 1:
    form = MyModelFormA(data=request.POST)
elif id == 2:
    form = MyModelFormB(data=request.POST)
else:
    form = MyModelFormN(data=request.POST)

if form.is_valid():
    form.save() else:
if id == 1:
    form = MyModelFormA()
elif id == 2:
    form = MyModelFormB()
else:
    form = MyModelFormN()
于 2012-07-15T18:09:59.143 に答える