【问题标题】:Mapping a different field OneToOneField in a ModelForm在 ModelForm 中映射不同的字段 OneToOneField
【发布时间】:2013-05-15 12:51:08
【问题描述】:

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

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True, db_index=True)

class PasswordRecovery(models.Model):
    user = models.OneToOneField(User, primary_key=True)
    token = models.CharField(default=utils.make_token)
    password = models.CharField(max_length=128)

然后我有一个 PasswordRecovery 模型的表单

class PasswordRecoveryForm(forms.ModelForm):
    password_check = forms.CharField(max_length=128)
    class Meta:
        model = PasswordRecovery
        fields = ('user', 'password', 'password_check')

这里省略了一些细节。如果您认为它们相关,请告诉我。

问题是用户字段显示为“选择”元素,我希望它是一个电子邮件字段。我无法从列表中选择用户,而是要求输入电子邮件。

我该怎么做?

提前致谢

【问题讨论】:

    标签: django django-models django-forms


    【解决方案1】:

    你应该重写 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 不会对电子邮件使用自动完成功能。有没有办法解决这个问题?
    • 嗯.. 实际上还有另一个问题。我希望表单更新现有条目,但如果不验证表单(我需要电子邮件地址),我无法获得实例。
    • 生成的html字段名可以找到解决方案here
    • 对于编辑模式,从传递的用户实例加载电子邮件,添加__init__方法
    猜你喜欢
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 2022-01-07
    • 2014-10-13
    • 2019-12-17
    • 1970-01-01
    相关资源
    最近更新 更多