@MAGistr_MTM
Учусь программировать

Как сохранить две модели на одной странице?

Доброго времени суток.

У меня есть две модели: 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.
Есть варианты как решить этот вопрос? Буду очень благодарен за помощь.
  • Вопрос задан
  • 230 просмотров
Решения вопроса 1
@MAGistr_MTM Автор вопроса
Учусь программировать
Всем спасибо, сам разобрался.
Просто выкинул поле Юзер из формы. И пры сохранении формы проставил commit=False, а поле юзер вручную прописал.
if profile_form.is_valid():
            customer_profile = profile_form.save(commit=False)
            customer_profile.user = self.object
            customer_profile.save()
            post_data = self.profile_form_valid(request)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы