У меня есть веб-приложение, которое позволяет пользователям создавать учетные записи, и при этом создает пользовательский объект из стандартной модели Django User, связанной с пользовательской моделью UserProfile, а также с моделью адресов.Я построил HTML-форму, которая позволяет пользователю обновлять свой адрес и профиль с помощью ContactInfoForm, который подклассов и AddressForm и UserProfileForm;оба являются ModelForms следующим образом:
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, затем вызвал функцию сохранения Address и UserProfile следующим образом:
def save(self):
address = AddressForm.save(self)
profile = UserProfileForm.save(self)
, однако, это не работает, поскольку экземпляр self является объектом пользователя, итаким образом обе вышеупомянутые функции возвращают пользовательский объект
2) Является ли моя реализация метода init ContactInfoForm лучшим способом предварительного заполнения формы HTML, когда пользователь впервые посещает обновлениестраница контактной информации?Другими словами, является ли построение словаря параметров и использование его в качестве исходного аргумента правильным.Помните, у меня есть доступ к объекту пользователя из request.user, так как это представление находится за декоратором login_required ...
3) Возможно, есть лучший способ добиться того, чего я пытаюсь достичьне так сложно и больше Django / Pythonic?