Доброго времени суток.
У меня есть две модели:
User
и
CustomerProfile
. Они связаны как
OneToOneField
. Мне нужно создавать их обоих на одной странице. Вот примеры кода:
views.py:
class UserCreateView(generic.CreateView):
template_name = 'dashboard/users/user_create.html'
model = User
form_class = forms.NewCustomerForm
profile_form = forms.CustomerProfileForm
def get_initial(self):
initial = super(UserCreateView, self).get_initial()
initial = initial.copy()
initial['username'] = generate_username()
return initial
def get(self, request, *args, **kwargs):
request.GET = request.GET.copy()
if request.META['HTTP_REFERER'].endswith('orders/add/'):
request.GET['HTTP_REFERER'] = 'order_create'
return super(
UserCreateView, self).get(request, *args, **kwargs)
def get_success_url(self, request):
if request.GET.get('HTTP_REFERER') == 'order_create':
return reverse('dashboard:order-create')
return reverse('dashboard:users-index')
def get_context_data(self, *args, **kwargs):
ctx = super(UserCreateView, self).get_context_data(
*args, **kwargs
)
ctx['cancel_url'] = reverse('dashboard:users-index')
ctx['profile_form'] = self.profile_form
return ctx
def form_valid(self, form, request):
self.object = form.save()
return HttpResponseRedirect(self.get_success_url(request))
def post(self, request, *args, **kwargs):
self.object = None
form = self.get_form()
if form.is_valid():
post_data = self.form_valid(form, request)
else:
post_data = self.form_invalid(form)
profile_form = self.profile_form(
**self.get_profile_form_kwargs())
# profile_form.instance.user = self.object
import pdb; pdb.set_trace() # debug yskhlyan
if profile_form.is_valid():
customer_profile = profile_form.save()
customer_profile.save()
post_data = self.form_valid(form, request)
else:
post_data = self.render_to_response(
self.get_context_data(form=form, profile_form=profile_form))
return post_data
def get_profile_form_kwargs(self):
kwargs = {
'initial': self.get_profile_initial(),
'prefix': self.get_prefix(),
}
if self.request.method in ('POST', 'PUT'):
kwargs.update({
'data': self.request.POST,
'files': self.request.FILES,
})
return kwargs
def get_profile_initial(self):
initial = super(UserCreateView, self).get_initial()
initial = initial.copy()
initial['user'] = self.object
return initial
forms.py:
class NewCustomerForm(forms.ModelForm):
class Meta:
model = User
exclude = ['password', 'groups', 'user_permissions', 'last_login']
widgets = {
'is_active': forms.HiddenInput(),
'date_joined': forms.HiddenInput(),
'username': forms.HiddenInput(),
}
class CustomerProfileForm(forms.ModelForm):
class Meta:
model = Customer
exclude = ['street', 'city', 'zip_code']
widgets = {
'date_of_birth': forms.DateInput(),
'user': forms.HiddenInput(),
}
Я сначала создаю экземпляр класса
User
, сохраняю его(здесь все ОК). Но вот когда создаеться
CustomerProfile
- форма не проходит валидацию. А именно поле
user
, так как такого значения(которое только что было созданное) нету в изначальном
queryset
.
Есть варианты как решить этот вопрос? Буду очень благодарен за помощь.