问题
I have the regular Django User
model and a UserDetails
model (OneToOneField
with User
), which serves as an extension to the User
model. (I tried Django 1.5's feature and it was a headache with strangely horrible documentation, so I stuck with the OneToOneField
option)
So, in my quest to build a custom registration page that will have a registration form comprised of the User
fields and the UserDetails
fields, I wondered if there was a way to generate the form automatically (with all of its validations) out of these two related models. I know this works for a form made of one model:
class Meta:
model = MyModel
But is there anyway to get a similar functionality for a form comprised of two related models?
回答1:
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
回答2:
One way you can accomplish this, if you want to keep the ModelForm for User and UserDetails separate would be to return both forms to the front-end, and make sure they are both in the same html form element (i.e. all fields will be returned when data is posted).
This works if User and UserDetails don't have any fields with the same name. To input the data in each ModelForm instance, you use the usual method:
form_user = UserForm(request.POST, instance=request.user)
form_user_details = UserDetailsForm(request.POST, instance=request.user.userdetails)
来源:https://stackoverflow.com/questions/15889794/creating-one-django-form-to-save-two-models