2012-03-25 87 views
0

我有一个Web应用程序,它允许用户创建一个帐户,并在此过程中创建一个用户对象,形成与自定义UserProfile模型关联的标准Django用户模型,以及地址模型。我已经构建了一个HTML表单,允许用户通过使用AddressInfoForm和UserProfileForm的子类来更新他们的地址和配置文件;这两者都是ModelForms,如下:保存具有多继承性的Django模型表格

class AddressForm(forms.ModelForm): 
    class Meta: 
     model = common_models.Address 
     exclude = ('updated_dt','address_type','created_dt') 

    def __init__(self,*args,**kwargs): 
     super(AddressForm,self).__init__(*args,**kwargs) 

    firstname = forms.CharField(max_length=100, min_length=1, error_messages={'required':'Please Enter First Name'}) 
    lastname = forms.CharField(max_length=100, min_length=1, error_messages={'required':'Please Enter Last Name'}) 
    address1 = forms.CharField(max_length=100, min_length=1, error_messages={'required':'Please Enter Address'}) 
    etc... 

class UserProfileForm(forms.ModelForm): 
    class Meta: 
     model = common_models.UserProfile 
     exclude = ('created_dt','updated_dt','entity_active','profile_hash','user','address') 

    account_type = forms.ChoiceField(choices=account_choices,widget=forms.Select(attrs={'id':'account_type_list'}),error_messages={'required':'Please Select Account Type'}) 
    name = forms.CharField(max_length=100, min_length=1, error_messages={'required':'Please Company Name'}) 
    supplier_type = forms.ModelChoiceField(queryset=common_models.SupplierTypeCode.objects.all(),required=False,widget=forms.Select(attrs={'id':'account_type_select'})) 
    buyer_type = forms.ModelChoiceField(queryset=common_models.ClientTypeCode.objects.all(),widget=forms.Select(attrs={'id':'account_type_select'}),required=False) 


class ContactInfoForm(AddressForm,UserProfileForm): 
    class Meta: 
     model = common_models.User 
     exclude = ('email','username', 
      'password','last_login','date_joined') 

    def __init__(self,user=None,request_post_data=None,*args,**kwargs): 
     if not request_post_data: 
       params = dict([tuple([k,v]) for k,v in user.get_profile().address.__dict__.items()] + 
      [tuple([k,v]) for k,v in user.get_profile().__dict__.items()]) 
       super(ContactInfoForm,self).__init__(initial=params,*args,**kwargs) 
      else: 
       super(ContactInfoForm,self).__init__(request_post_data,instance=user) 

现在,我有以下问题:

1)我如何保存ContactInfoForm,这样,无论是user_profile和地址表进行更新,沿与auth_user表?我曾尝试重写保存功能在ContactInfoForm,然后调用地址和用户配置的保存功能如下:然而

def save(self): 
    address = AddressForm.save(self) 
    profile = UserProfileForm.save(self) 

,不为自己的工作情况是用户对象,因此上述两种上述函数返回一个用户对象

2)是我执行ContactInfoForm的初始化方法的预先填充HTML表单的最好方式,当用户第一次访问更新联系信息页面?换句话说,params字典的构造是否正确,并将其用作初始参数。请记住,我有权访问request.user中的用户对象,因为此视图位于login_required装饰器的后面...

3)是否有更好的方法可以实现我试图实现的目标,复杂和更多的Django/Pythonic?

+0

'类ContactInfoForm(AddressForm,UserProfileForm):...'将不起作用,因为ModelForms不允许多重继承。请参阅https://code.djangoproject.com/ticket/7018 – 2012-03-26 14:18:29

回答

2

通常在Django中,这样的事情是通过创建3个独立的表单并在一个视图中处理它们来完成的。

address_form = AddressForm(request.POST) 
profile_form = UserProfileForm(request.POST) 
contacts_form = ContactInfoForm(request.POST) 
if address_form.is_valid() and profile_form.is_valid() and contacts_form.is_valid(): 
    address_form.save() 
    profile_form.save() 
    contacts_form.save() 

也许这是更多的代码,但它更清晰易读。