[編集]
new_method = ...およびsyspar.method.add()行を削除したため(これはmethod.save()によって処理されます)、最初に破棄したソリューションはDRYになり、完全に受け入れられます。
self.fields []。initialの設定(pyrikuの回答による)が追加> 0の場合にのみ機能するのは、まだ奇妙だと思います。これは、「フォームの追加」ボタンが表示されるまでフォームを表示したくないという単純なユースケースだからです。クリックすると、extra = 0である必要があり、新しく追加されたフォームの初期値を設定できる必要があります。
[ /編集]
免責事項:私は関連する質問に対する多くの回答を調べましたが、機能する解決策は1つしか見つかりませんでしたが、私には無愛想で、あまり乾燥していないように見えます(4378667)/免責事項
ユーザーが「add_method」を押したときにのみ新しいフォームを表示したいので、extraを0に設定したmodelformsetがあります。新しく追加されたフォームが空であることを除いて、すべてが正常に機能します(望ましい動作:メソッドテーブルで設定した名前のデフォルト値が含まれています)
models.pyの場合:
class System(models.Model):
method = models.ManyToManyField(Method)
...
class Method(models.Model):
name = models.CharField()
...
view.pyで:
syspar = System.objects.get(id=sys_id)
MethodFormSet = modelformset_factory(Method, form=MethodForm, extra=0)
if request.POST:
if 'add_method' in request.POST:
new_method = Method.objects.create(name='whatever')
syspar.method.add(new_method)
post = request.POST.copy()
post['method-TOTAL_FORMS'] = repr(int(post['method-TOTAL_FORMS'])+ 1)
post['method-2-name'] = 'whatever' # code needed here to get actual value of -2-
methodformset = MethodFormSet(data=post, prefix='method',
queryset=Method.objects.filter(id__in=syspar.method.all()))
次の行に問題があります:post ['method-2-name']=''これはひどいです。理由は次のとおりです。
- すでにdbテーブルに値を設定しています
- それぞれの場合の「2」の値を決定するために、余分な手間が必要になります
私はこのアプローチを試し、初期設定も試みました(他の関連する質問への回答で示唆されているように)が、どちらも機能せず、両方とも非DRYコードになりました。
これを行うためのより良い方法があるはずです...