0

製品モデルと価格モデルがあります。価格モデルには、製品モデルへの FK があります。複数の価格が存在する場合があります (販売されたユニットの数量によって異なります)。django 1.2.5 より前のhttp://yergler.net/blog/2009/09/27/nested-formsets-with-django/は問題を解決します。しかし、詳細なhttp://www.mail-archive.com/django-users@googlegroups.com/msg124195.htmlとして、これはもはや機能しません。

目的の結果を終了します: データを編集および追加するには、次のフォームを使用します。

製品 1 - 価格 1、数量 - 価格 2、数量 製品 2 - 価格 1、数量 製品 3 - 価格 1、数量 - 価格 2、数量 - 価格 3、数量

明確にするために再現:

Nathan の元のコードでは、最下位レベルのフォームセットは次のように作成されます。

TenantFormset(data=self.data,
              instance=instance,
              prefix='TENANTS_%s' % pk_value)

ここで、instance は Building のインスタンスであり、テナントの「親」またはコンテナーであり、self はのインスタンスです。

class BaseBuildingFormset(BaseInlineFormSet)

これは次のようにインスタンス化されます:

BuildingFormset = inlineformset_factory(models.Block,
                                        models.Building,
                                        formset=BaseBuildingFormset,
                                        extra=1)

これを回避するために、self.data を渡すのをやめました。これにより、レンダリングされてビューに POST された後でも、最下層のフォームは常に is_bound = False になります。その結果、検証は常に失敗し、フォームが表すオブジェクトは更新できません。Nathan のブログ投稿のコードを使用して動作を再現したので、フォームセットをネストするこのアプローチはもはや有効ではないか、1.3 で動作するようにコードを微調整する必要があるようです。

Django 1.2.5 までは、Nathan のコードは問題なく動作します。ただし、1.3 では、self.data が TenantFormset に渡されると、空であることが判明し、ManagementForm 情報が提供されていないため、ValidationError が発生します。
これは #11418、AFAICT の意図した結果です。

これをどのように機能させるかについて、他に考えがある人はいますか?

乾杯、

(詳細なコード例がなくて申し訳ありません。ネイサンの投稿は私のコードよりもはるかに明確なので、それを確認することをお勧めします。)

一般的な注意:これを行う方法については、多くの混乱があるようです。ここの回答で示されています http://www.reddit.com/r/django/comments/hwyto/is_there_a_way_to_do_nested_formsets_in_django/

4

3 に答える 3

2

django docs が言うように、フォームがバインドされていない場合は data = None を渡す必要があります:

data = None
if self.data:
    data = self.data
form.nested = [ModelXYFormset(data=data, instance = instance, prefix = 'opt%s' % pk_value)]
于 2013-02-21T09:27:02.550 に答える
0

私は現在同じことを試みています。Nathanのコードから同じソリューションを実装しましたが、ValidationError問題が発生しました。ここに示すように、Django1.3がフォームセットの動作を更新しました。だから私のコードでは、

TenantFormset(data=self.data, instance=instance, prefix='TENANTS_%s' % pk_value)

になります

TenantFormset(instance=instance, prefix='TENANTS_%s' % pk_value)

しかし、私はまだ空白のフォームを取得しています。

于 2011-10-04T17:28:17.460 に答える
0

これは、サブサブフォームを検証することに関して機能するように見える回避策です。

BaseBuildingFormset で:

def is_valid(self):
    result = super(BaseProtocolEventFormSet, self).is_valid()

    for form in self.forms:
        if hasattr(form, 'nested'):
            for n in form.nested:
                n.data = form.data
                if form.is_bound:
                    n.is_bound = True
                for nform in n:
                    nform.data = form.data
                    if form.is_bound:
                        nform.is_bound = True
                # make sure each nested formset is valid as well
                result = result and n.is_valid()
    return result

各フォームとフォームセットのデータは同じである必要があります (完全な POST データ)。ここでは、これを取得していないフォームに対して手動で設定します。また、BaseForm クラスでは、is_bound はフォームにデータまたはファイルがあることを確認するだけであることもわかります。フォームにデータがあると、それを true に設定します。

于 2011-12-06T12:42:52.847 に答える