2

假设我有一个模型如下。

模型.py

class Profile(models.Model):
    user = models.OneToOneField(User)
    middle_name = models.CharField(max_length=30, blank=True, null=True)

email在 ModelForm 中有一个自定义字段,如下所示

表格.py

class ProfileForm(ModelForm):
    email = forms.CharField()
    class Meta:
         model = models.Profile

    fields = ('email', 'middle_name')

在设置上述模型表单的实例时,数据会预填充到编辑模板的表单中,如下所示。

视图.py

def edit_profile(request):
    profile = models.Profile.objects.get(user=request.user)
    profileform = forms.ProfileForm(instance=profile)
    return render_to_response('edit.html', { 'form' : 'profileform' }, context_instance=RequestContext(request))

现在在表单中,我为 Profile 模型下的所有字段预填充了所有值,但自定义字段为空,这很有意义。

但是有没有办法可以预填充自定义字段的值?也许是这样的:

email = forms.CharField(value = models.Profile.user.email)
4

1 回答 1

6

我可以建议别的吗?如果它与该模型无关,我不喜欢email在 ModelForm 中拥有该字段。Profile

相反,如果只拥有两个表单并将初始数据传递给包含的自定义表单,怎么样email?所以事情看起来像这样:

表格.py

# this name may not fit your needs if you have more fields, but you get the idea
class UserEmailForm(forms.Form):
    email = forms.CharField()

视图.py

profile = models.Profile.objects.get(user=request.user)
profileform = forms.ProfileForm(instance=profile)
user_emailform = forms.UserEmailForm(initial={'email': profile.user.email})

然后,您正在验证配置文件和用户电子邮件表单,但除此之外的事情基本相同。

我假设您没有在 Profile ModelForm 和此 UserEmailForm 之间共享逻辑。如果您需要配置文件实例数据,您可以随时将其传递到那里。

我更喜欢这种方法,因为它不那么神奇,并且如果您在一年内回顾您的代码,您不会想知道为什么,在简短的扫描中,为什么它在该模型上不作为字段存在时email的一部分。ModelForm

于 2012-12-20T12:33:38.637 回答