Django - UpdateView с несколькими модельными формами - одна отправка - PullRequest
0 голосов
/ 06 мая 2019

Я разрабатываю веб-сайт, где пользователи могут регистрироваться и редактировать свою информацию. Я хотел бы использовать мульти форму на одной странице. Я могу разработать форму регистрации, используя CreateView. Но когда я использую UpdateVIew, я не знаю, как добавить начальное значение в мульти-форме.

Мой код (view.py) ниже. Я могу добавить form данные в качестве начального значения, но не form2. Подскажите пожалуйста как добавить form2 данные в качестве начального значения.

▪️view.py

class UserUpdate(OnlyYouMixin, generic.UpdateView):
    model = Profile
    form_class = ProfileForm
    second_form_class = ProfileNearStationForm
    template_name = 'accounts/user_form.html'

    def get_context_data(self, **kwargs):
        context = super(UserUpdate, self).get_context_data(**kwargs)

        if 'form' not in context:
            context['form'] = self.form_class(self.request.GET, instance=self.request.user)
        if 'form2' not in context:
            context['form2'] = self.second_form_class(self.request.GET, instance=self.request.user)
        return context

    def get(self, request, *args, **kwargs):
        super(UserUpdate, self).get(request, *args, **kwargs)
        form = self.form_class
        form2 = self.second_form_class
        return self.render_to_response(self.get_context_data())

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        form = self.form_class(request.POST, instance=self.request.user)
        form2 = self.second_form_class(request.POST, instance=self.request.user)

        if form.is_valid() and form2.is_valid():
            profile = form.save(commit=False)
            profile.save()
            station = form2.save(commit=False)
            station.user = user
            station.save()
            messages.success(self.request, 'Settings saved successfully')
            return HttpResponseRedirect(self.get_success_url())
        else:
            return self.render_to_response(
              self.get_context_data(form=form, form2=form2))

    def get_success_url(self):
        return resolve_url('accounts:user_form', pk=self.kwargs['pk'])

▪️form.py

class ProfileForm(forms.ModelForm):
    name = forms.CharField(required=True)
    tel_number = forms.CharField(required=True)

    class Meta:
        model = Profile
        fields = ('name', 'tel_number')

class ProfileNearStationForm(forms.ModelForm):
    prefecture = forms.ModelChoiceField(queryset=areas_model.Prefecture.objects.all(), required=True)
    railway = forms.ModelChoiceField(queryset=areas_model.Railway.objects.none(), required=True)
    station = forms.ModelChoiceField(queryset=areas_model.Station.objects.none(), required=True)
    memo = forms.CharField(required=False)

    class Meta:
        model = ProfileNearStation
        fields = ('prefecture', 'railway', 'station', 'memo')

▪️model.py

class Profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    name = models.CharField(max_length=255)
    tel_number = models.CharField(max_length=13)

class ProfileNearStation(models.Model):
    prefecture = models.ForeignKey(areas_model.Prefecture, on_delete=models.CASCADE)
    railway = models.ForeignKey(areas_model.Railway, on_delete=models.CASCADE)
    station = models.ForeignKey(areas_model.Station, on_delete=models.CASCADE)
    memo = models.CharField(max_length=255, null=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...