私は、何かのものの上に未知数のヘルパーを保存する必要のあるモデルフォームを持っています。名前は保存時にシリアル化することができますが、それは問題ではありません。それは、投稿時にそれらをきれいにして検証することができます。JavaScriptとJSONFieldを使用してDjangoフォームに動的にフィールドを追加する
フォームは次のようになります。
class ThingForm(forms.ModelForm):
"""
Form for the Thing
"""
owner = forms.CharField()
helpers = forms.CharField()
class Meta:
model = Thing
def save(self, *args, **kwargs):
"""
Serialize helpers to JSON.
"""
...
モデルはJSONFieldを使用してシリアル化されたヘルパーを格納しています。
class Thing(models.Model):
owner = models.CharField()
helpers = JSONField()
私は同じ入力された名前と、必要に応じJavaScriptができるだけ多くのヘルパーを追加することがあります。ヘルパーのタプルを返して
<input name="helpers" value="Fred" />
<input name="helpers" value="Joe" />
。 問題はフォームが有効でない場合 - その名前は失われますとクリーニングが機能していないことです。
私が最初に考えたのは、フォームのコンストラクタに追加することでした:
def __init__(self, *args, **kwargs):
super(ThingForm, self).__init__(*args, **kwargs)
try:
helpers = args[0].pop('helpers')
for name in helpers:
# Add a charfield, or something?
except:
pass
しかし、私は本当にどこにも届かない...
問題は、余分なヘルパーがフォームでクリーンアップされるため、テンプレートが取得されるまでに存在しないことです。 – Wil
これは追加したクリーンメソッドですか?エラーをレンダリングするために、 'request.POST'でバインドされたフォームをテンプレートに戻している間は、' form.data'のままでなければなりません。 – AdamKG
いいえ、フォームはかなりバニラです。テンプレート内のイテレータを使用すると、最後の入力の文字が繰り返し処理されます(form.data.helpersに文字列があります)。 – Wil