Django 扩展用户模型并显示表单

1 投票
3 回答
1497 浏览
提问于 2025-04-15 21:20

我正在制作一个网站,想要实现用户资料管理。基本的功能就是让用户自己编辑一些个人信息,比如名字和姓氏等等。现在,我需要扩展用户模型,添加我自己的内容和电子邮件地址。

我在显示表单时遇到了一些问题。下面的例子会更好地说明我想要实现的目标。

这是我扩展后的用户模型。

class UserExtended(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    kod_pocztowy = models.CharField(max_length=6,blank=True) 
    email  = models.EmailField()

这是我的表单的样子。

class UserCreationFormExtended(UserCreationForm): 
    def __init__(self, *args, **kwargs): 
        super(UserCreationFormExtended, self).__init__(*args, **kwargs)       
        self.fields['email'].required = True
        self.fields['first_name'].required = False
        self.fields['last_name'].required = False
    class Meta: 
        model = User 
        fields = ('username', 'first_name', 'last_name', 'email')

在注册时一切正常,因为我需要让用户输入用户名和电子邮件,但在编辑资料时,表单显示的字段太多了。我不想让他们编辑用户名和电子邮件。请问我该如何在表单中禁用这些字段呢?

谢谢你的帮助。

3 个回答

0

试着把 Meta 中的 'username' 和 'email' 字段去掉:

class Meta: 
    model = User 
    fields = ('first_name', 'last_name')
0

你应该创建一个新的表单,里面不包含你不想要的字段(或者干脆在字段列表里不提这些字段)。然后把这两个不同的表单传递给注册和编辑个人资料的页面。

0

我做的事情是创建了一个新的表单,然后使用了它,结果成功了。这个表单不仅可以编辑用户模型中的字段,还可以编辑用户扩展模型中的字段。谢谢大家的帮助。

class UserProfileForm(forms.ModelForm):

def __init__(self, *args, **kwargs):
    super(UserProfileForm, self).__init__(*args, **kwargs)
    try:            
        self.fields['first_name'].initial = self.instance.user.first_name
        self.fields['last_name'].initial = self.instance.user.last_name
        self.fields['email'].initial = self.instance.user.email
    except models.User.DoesNotExist:
        pass

email = forms.EmailField(label = "Główny adres email",
                         help_text="",
                         required=True)
first_name = forms.CharField(label = "Imię",
                             required=False)
last_name = forms.CharField(label = "Nazwisko",
                            required=False)
kod_pocztowy = forms.RegexField('\d{2}-\d{3}',
                                required = False,
                                label="Kod pocztowy",
                                error_messages={"invalid":'Poprawna wartość to np: 41-200'})

class Meta:
    model = UserExtended
    exclude  = ('user')

def save(self, *args, **kwargs):
    u = self.instance.user
    u.email = self.cleaned_data['email']
    u.first_name = self.cleaned_data['first_name']
    u.last_name = self.cleaned_data['last_name']
    u.kod_pocztowy = self.cleaned_data['kod_pocztowy']
    u.save()
    profile = super(UserProfileForm, self).save(*args, **kwargs)
    return profile

撰写回答