django编辑模型与相关模型的字段

时间:2014-03-03 15:17:45

标签: django django-forms

我在我的Django应用上创建了这个UserProfile模型,我希望存储一些用户信息,例如about_metwitter等。

在我的表单中,我(现在)只是添加了用户模型中的额外字段(名字,姓氏,电子邮件),保存用户配置文件后,我查询了用户模型并更新了那个,但我想知道是否我可以在同一页面上从单独的表单(UserForm)加载这些字段,而无需手动添加这些字段。到目前为止,这是我的代码:

class ProfileForm( forms.ModelForm ):
    first_name = forms.CharField( required = True, widget = forms.TextInput(
        attrs = {
            'placeholder': 'First name'
        }
    ) )

    last_name = forms.CharField( required = True, widget = forms.TextInput(
        attrs = {
            'placeholder': 'Last name'
        }
    ) )

    email = forms.EmailField( required = True, widget = forms.TextInput(
        attrs = {
            'placeholder': 'Email address'
        }
    ) )

    facebook_url = forms.URLField( required = False )
    gplus_url = forms.URLField( required = False )
    about_me = forms.CharField( required = False, widget = forms.Textarea( attrs = {
        'rows': 10,
        'placeholder': 'Something about you'
    } ) )

    class Meta:
        model = UserProfile
        fields = ['facebook_url', 'gplus_url', 'twitter_url', 'website', 'about_me']
        widgets = {
            'facebook_url': forms.TextInput(
                attrs = {
                    'placeholder': 'Your facebook url'
                }
            ),
            'gplus_url': forms.TextInput(
                attrs = {
                    'placeholder': 'Your google+ url'
                }
            )
        }

正如您所看到的,前三个字段应该是不同表单的一部分,但如何将其包含在内?我的代码运行正常,但我觉得有一种Django方法可以做到这一点。

1 个答案:

答案 0 :(得分:1)

您可以在一个页面上使用2个表单。只需为表单选择不同的前缀:

user_form = UserForm(prefix='user_form')
profile_form = UserForm(prefix='profile_form')

只需在一个html <form>标记中打印出来:

<form>
    {{ user_form.as_p }}
    {{ profile_form.as_p }}
    <input type="submit"/>
</form>

只需验证每一个,然后保存:

if user_form.is_valid() and profile_form.is_valid():
    user_form.save()
    profile_form.save()
编辑:正如丹尼尔罗斯曼指出的那样,您可能希望在每个表单上单独检查is_valid(),这样您将始终在两个表单上看到错误。像这样:

user_valid = user_form.is_valid()
profile_valid = profile_form.is_valid()

if user_valid and profile_valid:
    user_form.save()
    profile_form.save()