Orc*_*rca 12 python django django-models django-forms
我有常规的Django User模型和UserDetails模型(OneToOneField带User),它作为User模型的扩展.(我尝试了Django 1.5的功能,这是一个令人头疼的奇怪可怕的文档,所以我坚持OneToOneField选择)
所以,在我寻求建立一个自定义的注册页面,将有包括中的登记表User字段和UserDetails领域,我想知道是否有自动生成表格(及其所有验证的)这些两个相关模型的方法.我知道这适用于由一个模型组成的表单:
class Meta:
model = MyModel
Run Code Online (Sandbox Code Playgroud)
但是,无论如何要为包含两个相关模型的表单获得类似的功能吗?
cat*_*ine 15
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
Run Code Online (Sandbox Code Playgroud)
一种方法可以实现这一点,如果你想让ModelForm for User和UserDetails分开将两个表单都返回到前端,并确保它们都在同一个html表单元素中(即所有字段都将被返回何时发布数据).
如果User和UserDetails没有任何具有相同名称的字段,则此方法有效.要在每个ModelForm实例中输入数据,请使用常用方法:
form_user = UserForm(request.POST, instance=request.user)
form_user_details = UserDetailsForm(request.POST, instance=request.user.userdetails)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12761 次 |
| 最近记录: |