Django: Как вернуть инлайн набор форм с ошибками
Я создал форму для регистрации пользователя, заставив его создать объект User и объект UserProfile следующим образом:
class UserCreationForm(UserCreationForm):
class Meta:
model = User
fields = ("email",)
class UserProfileCreationForm(ModelForm):
class Meta:
model = UserProfile
fields = (
"first_name",
"last_name",
)
RegisteredCustomerProfileCreationInlineFormset = inlineformset_factory(
User,
UserProfile,
form=UserProfileCreationForm,
extra=1,
can_delete=False,
can_order=False,
)
В моем представлении для отображения формы регистрации я делаю следующее:
class UserSignupView(CreateView):
form_class = UserCreationForm
template_name = "users/signup_form.html"
def get_context_data(self, **kwargs):
"""Adds the inline formset to the context."""
context = super(UserSignupView, self).get_context_data(**kwargs)
if self.request.POST:
context[
"user_profile_inline"
] = UserProfileCreationInlineFormset(
self.request.POST
)
else:
context[
"user_profile_inline"
] = UserProfileCreationInlineFormset()
return context
def form_invalid(self, request, form):
# Note: I added request as an argument because I was getting an error that
# says the method is expecting 2 arguments but got 3.
return render(self.request, self.template_name,
self.get_context_data(
form=form
)
)
def form_valid(self, form):
context = self.get_context_data()
user_profile_inline = context["user_profile_inline"]
if (
form.is_valid()
and user_profile_inline.is_valid()
):
# Handle valid case
...
else:
self.form_invalid(self, form)
Мой шаблон прост как
<form method="post">
{% csrf_token %}
{{ form.as_p }}
{{ user_profile_inline.as_p }}
<button type="submit" value="Save">Sign Up</button>
</form>
Когда мой form
, который служит для создания объекта User, недействителен, шаблон перезагружается нормально с ошибками в форме. Однако, когда набор форм недействителен, я получаю ошибку: "не был возвращен объект HttpResponse. Вместо него возвращается None."
Пожалуйста, помогите мне с правильным способом перезагрузки шаблона с ошибками для inline formset.