为什么我的表单干净方法没有做任何事情?

时间:2013-04-25 21:36:10

标签: django django-forms django-admin

我有两个在Django管理员中使用模型表单的基本模型。 Models.py类似于:

class FirstModel(models.Model):
    name = CharField(max_length=100)
    url = URLField()
class OtherModel(models.Model):
    model = models.ForeignKey(FirstModel)
    ##Other fields that show up fine and save fine, but include some localflavor

Forms.py看起来类似于:

class FirstModelForm(forms.ModelForm):
    def clean(self):
        #call the super as per django docs
        cleaned_data = super(FirstModelForm, self).clean()
        print cleaned_data
    class Meta:
        model = FirstModel
#other modelform is the same with the appropriate word substitutions and one field that gets overridden to a USZipCodeField

这些是堆叠的内联ModelAdmin,在admin.py中没有什么特别之处:

class OtherModelInline(admin.StackedInline):

    model = OtherModel
    fields = (#my list of fields works correctly)
    readonly_fields = (#couple read onlys that work correctly)

class FirstModelAdmin(admin.ModelAdmin):
    inlines = [
        OtherModelInline,
        ]
admin.site.register(FirstModel, FirstModelAdmin)

我有一个User模型,表单和ModelAdmin,它是User和UserCreationForm的子类,并覆盖它自己的clean方法。这完全符合预期。 问题出在FirstModelOtherModel上。我在FirstModelFormOtherModelForm的ModelForm子类中重写的clean方法不做任何事情。抛出异常或clean_data的打印。根本不值一提。其他一切都按预期工作,但就像我的干净方法甚至没有。 我错过了一些简单的东西,但我看不出是什么。任何帮助都会很棒。谢谢!

3 个答案:

答案 0 :(得分:1)

默认情况下,Django会为模型管理员动态生成模型表单。您必须通过设置表单属性来指定要使用自定义表单。

class OtherModelInline(admin.StackedInline):

    model = OtherModel
    fields = (...) # if this doesn't work after specifying the form, set fields for the model form instead
    readonly_fields = (#couple read onlys that work correctly)
    form = OtherModelForm

class FirstModelAdmin(admin.ModelAdmin):
    form = FirstModelForm
    inlines = [
        OtherModelInline,
        ]
admin.site.register(FirstModel, FirstModelAdmin)

答案 1 :(得分:0)

您需要从表单中的cleaned_data方法返回clean。如果你看the documentation for cleaning fields that rely on each other,你会注意到:

...
# Always return the full collection of cleaned data.
return cleaned_data

答案 2 :(得分:0)

父母'干净'方法可能无法幸免。如果由于模型的设置方式而提交的数据无法验证,则cleaning_data将为空。在Timmy链接的同一文档中提到了这一点,其中说:

  

当调用表单的clean()方法时,将运行所有单独的字段清理方法(前两个部分),因此self.cleaned_data将填充到目前为止幸存的任何数据。 因此,您还需要记住允许您想要验证的字段可能无法在最初的单个字段检查中幸存下来。

在这种情况下,如果您有一个URLField,则字段验证非常严格,除非您定义'verify_exists = False',否则它还会检查您是否放入了返回404的URL。在您的情况下,如果你想允许这样做,则需要这样做:

class FirstModel(models.Model):
    name = CharField(max_length=100)
    url = URLField(verify_exists=False)

除此之外,我不知道会发生什么。