Django表示不调用clean_ <fieldname>(在本例中为clean_email)

时间:2016-08-21 18:43:55

标签: python django

我找不到以下问题的答案,我花了几个小时才发现,因此我正在添加它。我将添加解决问题的方法和答案。

我正在关注This person的YouTube教程。出于某种原因,我输入相同的代码,我检查了每一个字母。但由于某种原因,我的清洁功能没有被调用。它可能很简单,特别是因为related question表现出类似的东西。这可能是一个框架,我错了,但我不知道它是什么。

以下是相关代码。

forms.py(从his Github完整复制/粘贴)

from django import forms

from .models import SignUp

class ContactForm(forms.Form):
    full_name = forms.CharField(required=False)
    email = forms.EmailField()
    message = forms.CharField()


class SignUpForm(forms.ModelForm):
    class Meta:
        model = SignUp
        fields = ['full_name', 'email']
        ### exclude = ['full_name']

    def clean_email(self):
        email = self.cleaned_data.get('email')
        email_base, provider = email.split("@")
        domain, extension = provider.split('.')
        # if not domain == 'USC':
        #   raise forms.ValidationError("Please make sure you use your USC email.")
        if not extension == "edu":
            raise forms.ValidationError("Please use a valid .EDU email address")
        return email

    # Final part is ommited, since it's not relevant.

admin.py(从教程中输入)

from django.contrib import admin

# Register your models here.
from .models import SignUp
from .forms import SignUpForm

class SignUpAdmin(admin.ModelAdmin):
    list_display = ['__unicode__', 'timestamp', 'updated']

    class Meta:
        model = SignUp
        form = SignUpForm

admin.site.register(SignUp, SignUpAdmin)

1 个答案:

答案 0 :(得分:0)

在使用一段时间的印刷语句并阅读看起来相似但最终没有解决我的问题的问题后,我决定研究Django的来源(受most similar question I could find启发的想法)。

然后,我决定调试源码,因为我想知道Django如何处理我的自定义函数(感谢tutorial + SO answer)。在源代码中,我发现定制函数是围绕return super(EmailField, self).clean(value)调用的(第585行,django / forms / fields.py,Django 1.8)。当我单步执行代码时,我找到了关键行if hasattr(self, 'clean_%s' % name):(第409行,django / forms / forms.py,Django 1.8)。我检查了name的值"email"。然而,if语句被评估为False(Pdb) p hasattr(self, 'clean_%s' % name))。我不明白为什么,直到我发现函数名称没有注册((Pdb)pp dir(self))。

我决定看一下整个源代码库并交叉检查每个文件,然后我发现

class Meta:
    model = SignUp
    form = SignUpForm

表示form / SignUpForm嵌套在Meta类中。起初,我没有想太多,但我慢慢地意识到它应该在Meta类之外,同时保持主类(SignUpAdmin)。

所以form = SignUpForm应该被认为是一个标签。对我来说,作为一个Django初学者,它仍然让我感到困惑,因为我认为Meta类应该封装两种类型的数据(模型和表单)。显然它不应该,这就是我错了。