1

見た目よりも複雑ですが、djangoフォームセットの検証がどのように機能するかについての情報を探しています。値を持つフォームセットがあります。これらの値の一部は、javascript によってそこに挿入できます (データベースにまだ存在しないことを意味します)。

class RequireOneFormSet(BaseInlineFormSet):
    def clean(self):        
        if any(self.errors):
            return

        form_count = len([f for f in self.forms if f.cleaned_data])
        if form_count < 1:
            raise ValidationError(_('At least one %(object)s is required.') %
                                  {'object':
                                   _(self.model._meta.object_name.lower())})

class VariantInline(admin.StackedInline):
    model = Variant
    extra = 1
    formset = RequireOneFormSet


class ProductAdmin(admin.ModelAdmin):
    class Meta:
        model = Product

    class Media:
        js = (os.path.join(STATIC_URL, 'js', 'admin_utils.js'), )

    exclude = ('slug',)
    filter_horizontal = ('category',)
    inlines = [ImageInline, DetailInline, VariantInline]
    manufacturer = ModelChoiceField(Manufacturer.objects.all())
    list_filter = ('name', 'manufacturer', 'category')
    list_display = ('name', 'manufacturer')
    search_fields = ('name',)
    save_as = True

次に、これらのエントリに基づいて、フォームセットの検証中にオブジェクトを作成したいと思います。「保存」ボタンをクリックすると、Django は DB にそのようなオブジェクトがないと文句を言います。

モデルの clean メソッド、ModelAdmin の clean、formset の save_formset をオーバーライドしようとしましたが、javascript によって作成されたこれらの値がプロセスの早い段階で除外されるため、うまくいきませんでした。どのメソッドがそれを処理するかについての情報を探しています。オーバーライドできますか?

編集: いくつかのコードを追加しました。使用されるビューは Django の汎用ビューです。

4

1 に答える 1

0

私はなんとかそれを解決することができました。重要なのは、独自のフィールドを作成し、そこでclean()メソッドをオーバーライドすることでした。クラスModelMultipleChoiceFieldのファイルdjango/forms / models.pyでわかるように、clean()は送信値のチェックを担当します。

class DetailsField(ModelMultipleChoiceField):
    def clean(self, value):     
        (code here)

class VariantForm(ModelForm):
    details = DetailsField(queryset=Detail.objects.all(),
                           widget=FilteredSelectMultiple('details', False))

class VariantInline(admin.StackedInline):
    model = Variant
    extra = 1
    formset = RequireOneFormSet
    form = VariantForm
于 2013-02-27T20:48:41.370 に答える