Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 将不同的字段映射到ModelForm中的OneToOneField_Django_Django Models_Django Forms - Fatal编程技术网

Django 将不同的字段映射到ModelForm中的OneToOneField

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

我有两个与OneToOneField相关的django模型。我将显示相关字段:

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
方法