Skip to main content
 首页 » 编程设计

python之为 UserProfile 指定的未知字段(用户名)-Django

2024年10月24日35thcjp

我正在尝试创建一个注册表单来注册 User 和他的 UserProfile。问题是 Django 说 username 不可用。

django.core.exceptions.FieldError: Unknown field(s) (username) specified for Use 
rProfile 

我希望表单包含我想要的所有属性(来自内置 User 和 UserProfile)。

那该怎么办?我知道问题是因为我添加了 UserCreationForm.Meta.fields 但如何让它工作?这似乎是一个清晰而简单的解决方案。

这是表格:

class UserProfileCreationForm(UserCreationForm): 
    password1 = forms.CharField(label="Password", widget=forms.PasswordInput) 
    password2 = forms.CharField(label="Password confirmation", widget=forms.PasswordInput) 
 
    class Meta(UserCreationForm.Meta): 
        model = UserProfile 
        fields = UserCreationForm.Meta.fields + ('date_of_birth','telephone','IBAN',) 
 
    def clean_password2(self): 
        # Check that the two password entries match 
        password1 = self.cleaned_data.get("password1") 
        password2 = self.cleaned_data.get("password2") 
        if password1 and password2 and password1 != password2: 
            msg = "Passwords don't match" 
            raise forms.ValidationError("Password mismatch") 
        return password2 
 
    def save(self, commit=True): 
        user = super(UserCreationForm, self).save(commit=False) 
        user.set_password(self.cleaned_data["password1"]) 
        if commit: 
            user.save() 
        return user 

用户资料模块:

class UserProfile(models.Model): 
    user = models.OneToOneField(User, related_name='user_data') 
    date_of_birth = models.DateField() 
    telephone = models.CharField(max_length=40) 
    IBAN = models.CharField(max_length=40) 
    created = models.DateTimeField(auto_now_add=True) 
    modified = models.DateTimeField(auto_now=True) 
 
    MARITAL_STATUS_CHOICES = ( 
        ('single', 'Single'), 
        ('married', 'Married'), 
        ('separated', 'Separated'), 
        ('divorced', 'Divorced'), 
        ('widowed', 'Widowed'), 
    ) 
    marital_status = models.CharField(max_length=40, choices=MARITAL_STATUS_CHOICES, null=True, blank=True) 
 
    HOW_DO_YOU_KNOW_ABOUT_US_CHOICES = ( 
        ('coincidence', u'It was coincidence'), 
        ('relative_or_friends', 'From my relatives or friends'), 
    ) 
    how_do_you_know_about_us = models.CharField(max_length=40, choices=HOW_DO_YOU_KNOW_ABOUT_US_CHOICES, null=True, 
                                                blank=True) 
 
    # TRANSLATOR ATTRIBUTES 
 
    is_translator = models.BooleanField(default=False) 
 
    language_tuples = models.ManyToManyField(LanguageTuple) 
 
    rating = models.IntegerField(default=0) 
 
    number_of_ratings = models.BigIntegerField(default=0) 
 
    def __unicode__(self): 
        return '{} {}'.format(self.user.first_name, self.user.last_name) 
 
    def __str__(self): 
        return '{} {}'.format(self.user.first_name, self.user.last_name) 

请您参考如下方法:

如错误所述,fields 属性只能包含表单所基于的模型中的字段,在本例中为 UserProfile。您不能以这种方式包含用户字段。相反,您将需要在类级别手动指定它们,就像您对 password1/password2 所做的那样。此外,您还需要在 save 方法中对它们进行一些操作。

与执行所有这些操作相比,您可能会发现创建一个包含 User 和 UserProfile 字段的自定义用户模型会更好;这样您就只有一个模型,所有字段都将自动包含在 UserCreationForm 中。