Настройка и обработка 2 форм моделей с одним и тем же классом FormView
Я пытаюсь использовать один класс FormView
для рендеринга и обработки двух связанных, но разных ModelForms. Одна из форм имеет FileInput
в качестве одного из своих полей, и она не отправляется должным образом, когда я нажимаю соответствующую кнопку.
views.py
class MyView(LoginRequiredMixin, FormView):
template_name = "tmp.html"
http_method_names = ["get", "post"]
login_url = "/to/login"
form_class = AForm
success_url = reverse_lazy("profile")
def get_context_data(self, **kwargs):
context = super(MyView, self).get_context_data(**kwargs)
prf = ModelA.objects.get(id=self.request.user.id)
context["form_a"] = AForm(instance=prf)
context["form_b"] = BForm(instance=None)
return context
def post(self, request, *args, **kwargs):
if "submit_a" in request.POST:
self.form_class = AForm
if "submit_b" in request.POST:
self.form_class = BForm
return super().post(request, *args, **kwargs)
def form_valid(self, form):
if self.form_class == AForm:
form.save()
elif self.form_class == BForm:
form.save()
return super().form_valid(form)
Связанная forms.py
для ModelA выглядит примерно так:
class AForm(ModelForm):
img_field = ImageField(widget=FileInput)
Две проблемы, с которыми я сейчас сталкиваюсь:
Когда форма загружается и пользователь нажимает кнопку отправки с предыдущими данными, я получаю
<ul class="errorlist"><li>img_field<ul class="errorlist"><li>This field is required.</li></ul></li></ul>
когда я проверяю form.errors.
Когда пользователь выбирает изображение для загрузки и нажимает submit (submit_a), я получаю IntegrityError
на колонке id (id пользователя), которая возвращает null. Я предполагаю, что поскольку я посылаю конкретный экземпляр пользователя в контекст формы через
prf = ModelA.objects.get(id=self.request.user.id)
context["form_a"] = AForm(instance=prf)
связанные данные пользователя (включая данные img_field), использованные для построения формы, будут доступны, когда форма будет отправлена.
Какие у меня есть варианты решения этих проблем?