为什么我们要在 Django 继承遗产?

2ic8powd  于 2023-01-10  发布在  Go
关注(0)|答案(1)|浏览(128)

这是我在这里的第一篇文章,我是django的初学者,我几乎阅读了William S. Vincent的django for beginners,在第8章中,他回顾了自定义用户模型,并为所需的表单创建了以下代码:

from django.contrib.auth.forms import UserCreationForm, UserChangeForm

from .models import CustomUser

class CustomUserCreationForm(UserCreationForm):
    class Meta(UserCreationForm):
        model = CustomUser
        fields = UserCreationForm.Meta.fields + ("age",)

class CustomUserChangeForm(UserChangeForm):
    class Meta:
        model = CustomUser
        fields = UserChangeForm.Meta.fields

我的问题是为什么我们在这里使用类 meta,为什么第一个类Meta继承自“UserCreationForm”,而第二个类Meta不继承。谢谢!

yxyvkwin

yxyvkwin1#

我的问题是为什么我们在这里使用类 meta,为什么第一个类Meta继承自“UserCreationForm”,而第二个类Meta不继承。
可能是打印错误,应该是:

class CustomUserCreationForm(UserCreationForm):
    class Meta(UserCreationForm.Meta):  # 🖘 inherit from the Meta innerclass
        model = CustomUser
        fields = UserCreationForm.Meta.fields + ('age',)

通常来说,* 总是 * 从超类的Meta中插入是一个好主意,因为在这种情况下,它还包含field_classes属性[GitHub]:

class Meta:
    model = User
    fields = ("username",)
    field_classes = {"username": UsernameField}

它在这里为用户名添加了一个特定的字段类,而不是默认的CharField .如果我们希望这个行为继续,那么我们需要继承它,否则我们的Meta没有这样的field_classes项,它将因此“后退”到一个简单的CharField .
后者更好,只需简单地说:

class CustomUserChangeForm(UserChangeForm):
    class Meta(UserChangeForm.Meta):
        model = CustomUser

因为对于现代版本的Django,它也会使用UsernameField字段类。

相关问题