1

[編集]

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コードになりました。

これを行うためのより良い方法があるはずです...

4

1 に答える 1

1

__init__()おそらく、必要な初期値を設定するために、そのフォームのメソッドをオーバーライドする必要があります。何かのようなもの:

def __init__(self, *args, **kwargs):
    super(MethodForm, self).__init__(*args, **kwargs)
    self.initial['field'] = 'value'
于 2012-07-25T08:57:02.403 に答える