Сохранение Django ModelForms с множественным наследованием - PullRequest
0 голосов
/ 25 марта 2012

У меня есть веб-приложение, которое позволяет пользователям создавать учетные записи, и при этом создает пользовательский объект из стандартной модели 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?

1 Ответ

2 голосов
/ 25 марта 2012

Обычно в 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()

Возможно, в этом случае немного больше кода, но гораздо понятнее и проще для чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...