Django 扩展用户模型并显示表单
我正在制作一个网站,想要实现用户资料管理。基本的功能就是让用户自己编辑一些个人信息,比如名字和姓氏等等。现在,我需要扩展用户模型,添加我自己的内容和电子邮件地址。
我在显示表单时遇到了一些问题。下面的例子会更好地说明我想要实现的目标。
这是我扩展后的用户模型。
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