POST后,Django管理BaseInlineFormSet验证

时间:2013-02-21 19:31:13

标签: django django-forms django-admin

寻找有关django formsets验证如何工作的信息,虽然它比听起来更复杂。我有一个带有值的formset,这些值的一部分可以通过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

接下来,基于这些条目,我想在formset验证期间创建对象。当点击“保存”按钮时,Django抱怨DB中没有这样的对象。

我试图覆盖模型的干净方法,清除ModelAdmin,formset的save_formset但没有运气,因为javascript创建的这些值在过程中被过滤掉了。我正在寻找信息哪种方法可以解决这个问题,并且可以覆盖它吗?

编辑: 添加了一些代码,使用的视图是Django的通用视图。

1 个答案:

答案 0 :(得分: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