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

时间:2010-04-07 19:39:45

标签: python django-models django-forms

我正在写网站,我想实施个人资料管理。基本的东西 将自己编辑一些用户详细信息,如名字和姓氏 现在,我不得不扩展用户模型以添加我自己的东西和电子邮件地址。

我在显示表格时遇到了麻烦。例子将更好地描述我 想实现。

这是我的扩展用户模型。

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 :(得分:0)

您应该创建另一个表单,该表单排除您不想要的字段(或者只是不在字段列表中指定它们)。然后将2个不同的表单传递给注册和编辑配置文件视图。

答案 1 :(得分:0)

尝试从Meta中的字段中删除“用户名”和“电子邮件”:

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

答案 2 :(得分:0)

我所做的是创建新表单并使用它并且它起作用。它允许编辑User模型中的字段,而不仅仅是UserExtended。谢谢你的帮助。

类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