在我的模型中,我设置了一个自定义模型(CodeUser
),其中包含User
模型django.contrib.auth
的外键。我实际上使用django-auth-ldap
,但User
模型是相同的。然后我有一个Code
模型,其中custodian
字段是特定CodeUser
的外键。
class CodeUser(models.Model):
user = models.ForeignKey('User')
# Other fields...
class Code(models.Model):
custodian = models.ForeignKey('CodeUser')
# Other fields...
我正在为ModelForm
模型使用Code
,并希望表单接受CodeUser
字段custodian
的电子邮件地址。我认为只需使用to_field_name
的{{1}}选项就可以完成此操作。
但是,如果用户不存在,我希望能够创建用户。我这样做是通过进行ModelChoiceField
查询来确保电子邮件可以与用户关联,然后使用LDAP
的{{1}}方法。
填充用户的过程工作正常,我只是在弄清楚这个代码应该放在我的django应用程序中的哪个位置。我尝试创建自定义字段populate
,然后将其用于代码模型窗格中django-auth-ldap
字段的class
。我为我的字段实现了自定义field_classes
方法,但在custodian
ModelForm验证期间永远不会调用此方法。似乎验证仅针对ModelForms降级为模型。
validate
最后,我的问题是,通过电子邮件地址进行Code
验证/填充的代码应该放在哪里?还有一些其他形式需要这个过程,所以我认为自定义字段类最有意义。
答案 0 :(得分:0)
你可以在两个不同的地方做。您可以覆盖CodeForm的change_form.html并通过JavaScript执行。
或者我过去所做的是在ModelForm中完成并覆盖“def clean”函数。这是我用自定义更改密码表单执行此操作的示例。
def clean(self):
cleaned_data = super(ChangePasswordForm, self).clean()
oldpass = cleaned_data.get('oldpassword')
if not self.user.check_password(oldpass):
raise forms.ValidationError("Invalid Password")
pass1 = cleaned_data.get('password1')
pass2 = cleaned_data.get('password2')
if pass1 != pass2:
raise forms.ValidationError("Passwords do not match")
也应该在ModelForm中工作。