16

我有常规的 DjangoUser模型和一个UserDetails模型(OneToOneFieldwith User),它用作User模型的扩展。(我尝试了 Django 1.5 的功能,但奇怪的可怕文档让我头疼,所以我坚持使用该OneToOneField选项)

因此,在我寻求构建一个自定义注册页面的过程中,该页面将包含一个由User字段和UserDetails字段组成的注册表单,我想知道是否有一种方法可以从这两个相关模型中自动生成表单(及其所有验证) . 我知道这适用于由一个模型制成的表格:

class Meta:
    model = MyModel

但是,对于由两个相关模型组成的表单,是否有类似的功能?

4

2 回答 2

17
from django.forms.models import model_to_dict, fields_for_model


class UserDetailsForm(ModelForm):
    def __init__(self, instance=None, *args, **kwargs):
        _fields = ('first_name', 'last_name', 'email',)
        _initial = model_to_dict(instance.user, _fields) if instance is not None else {}
        super(UserDetailsForm, self).__init__(initial=_initial, instance=instance, *args, **kwargs)
        self.fields.update(fields_for_model(User, _fields))

    class Meta:
        model = UserDetails
        exclude = ('user',)

    def save(self, *args, **kwargs):
        u = self.instance.user
        u.first_name = self.cleaned_data['first_name']
        u.last_name = self.cleaned_data['last_name']
        u.email = self.cleaned_data['email']
        u.save()
        profile = super(UserDetailsForm, self).save(*args,**kwargs)
        return profile
于 2013-04-09T03:08:39.307 回答
6

如果您想将 User 和 UserDetails 的 ModelForm 分开,您可以实现此目的的一种方法是将两个表单返回到前端,并确保它们都在同一个 html 表单元素中(即所有字段都将返回发布数据时)。

如果 User 和 UserDetails 没有任何具有相同名称的字段,则此方法有效。要在每个 ModelForm 实例中输入数据,请使用常用方法:

    form_user = UserForm(request.POST, instance=request.user)
    form_user_details = UserDetailsForm(request.POST, instance=request.user.userdetails)
于 2013-04-09T02:14:33.977 回答