Django 将不同的字段映射到ModelForm中的OneToOneField
我有两个与OneToOneField相关的django模型。我将显示相关字段:Django 将不同的字段映射到ModelForm中的OneToOneField,django,django-models,django-forms,Django,Django Models,Django Forms,我有两个与OneToOneField相关的django模型。我将显示相关字段: class User(AbstractBaseUser, PermissionsMixin): email = models.EmailField(unique=True, db_index=True) 及 然后我有一个PasswordRecovery模型的表单 class PasswordRecoveryForm(forms.ModelForm): password_check = forms.C
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(unique=True, db_index=True)
及
然后我有一个PasswordRecovery模型的表单
class PasswordRecoveryForm(forms.ModelForm):
password_check = forms.CharField(max_length=128)
class Meta:
model = PasswordRecovery
fields = ('user', 'password', 'password_check')
这里省略了一些细节。如果你认为它们相关,请告诉我
问题是,用户字段显示为“select”元素,我希望它是一个电子邮件字段。我不希望从列表中选择用户,而是希望它要求键入电子邮件
我该怎么做
提前感谢您应该重写clean_user方法来传递用户对象
class PasswordRecoveryForm(forms.ModelForm):
user = forms.EmailField(required=True)
password_check = forms.CharField(max_length=128)
class Meta:
model = PasswordRecovery
fields = ('user', 'password', 'password_check')
def clean_user(self):
user_email = self.cleaned_data['user']
if User.objects.get(email__iexact=user_email):
return User.objects.get(email__iexact=user_email)
return None
#If you wanna to fill in the email add this
def __init__(self, *args, **kwargs):
super(PasswordRecoveryForm, self).__init__(*args, **kwargs)
if self.instance:
self.fields['user'].initial = self.instance.user.email
您应该重写clean_user方法来传递用户对象
class PasswordRecoveryForm(forms.ModelForm):
user = forms.EmailField(required=True)
password_check = forms.CharField(max_length=128)
class Meta:
model = PasswordRecovery
fields = ('user', 'password', 'password_check')
def clean_user(self):
user_email = self.cleaned_data['user']
if User.objects.get(email__iexact=user_email):
return User.objects.get(email__iexact=user_email)
return None
#If you wanna to fill in the email add this
def __init__(self, *args, **kwargs):
super(PasswordRecoveryForm, self).__init__(*args, **kwargs)
if self.instance:
self.fields['user'].initial = self.instance.user.email
这是为了我。只有一个问题:表单上的字段是用name=“user”呈现的,因此Chrome不会对电子邮件使用autocomplete。有办法解决这个问题吗?嗯。。实际上还有一个问题。我希望表单更新现有条目,但在不验证表单的情况下无法获取实例(我需要电子邮件地址)。对于生成的html字段名,您可以找到编辑模式的解决方案,从传递的用户实例加载电子邮件,添加
\uuuuu init\uuuu
方法这为我做到了。只有一个问题:表单上的字段是用name=“user”呈现的,因此Chrome不会对电子邮件使用autocomplete。有办法解决这个问题吗?嗯。。实际上还有一个问题。我希望表单更新现有条目,但在不验证表单的情况下无法获取实例(我需要电子邮件地址)。对于生成的html字段名,您可以找到编辑模式的解决方案,从传递的用户实例加载电子邮件,添加\uuu init\uu
方法