Форма Django не показывает ошибки, но повторно отображает новую форму
У меня есть представление Insert, которое отображает данные модели из одной основной и одной связанной модели. После завершения отображения данных к таблице добавляется форма для добавления нового связанного элемента.
Это работает нормально - однако если я ввожу недопустимые данные (например, недопустимое время, если быть точным) и нажимаю одну из кнопок отправки, страница просто обновляется с пустой формой для ввода соответствующих данных. Она не отображает введенные данные и не выводит сообщение об ошибке, хотя форма включает поля для ошибок.
Я пробовал добавить form_invalid в CBV и вызвать форму, но я вижу, что она просто вызывает InserView снова без контекста (что в основном делает вызов get_context_data снова и дает мне новую пустую форму).
Как мне заставить его вывести форму с моими данными и ошибками. Смотрите код ниже:
views.py
class SegmentAddView(LoginRequiredMixin,CreateView):
login_url = reverse_lazy('login')
model = Segment
template_name = 'segment_add_view.html'
form_class = SegmentForm
def get_context_data(self, **kwargs):
context = super(SegmentAddView,self).get_context_data(**kwargs)
program_info = get_object_or_404(Program, pk=self.kwargs['pk'])
context['program_info'] = program_info
last_segment = program_info.segments.last()
if last_segment:
add_sequence_num = last_segment.sequence_number + Decimal(1.00)
else:
add_sequence_num = Decimal(1.00)
context['form'] = SegmentForm(initial={'sequence_number': add_sequence_num})
return context
def form_valid(self, form):
program = get_object_or_404(Program, pk=self.kwargs['pk'])
form.instance.program = program
return super().form_valid(form)
def form_invalid(self, form):
print(" Inside form invalid")
return super(SegmentAddView, self).form_invalid(form)
def get_success_url(self, **kwargs):
print(" Inmside Success")
altered_program = Program.objects.get(id=self.kwargs['pk'])
altered_program.save()
if 'save_another' in self.request.POST:
return reverse_lazy('segment_add', args=[self.kwargs['pk']])
return reverse_lazy('program_detail', args=[self.kwargs['pk']])
forms.py
class SegmentForm(forms.ModelForm):
class Meta:
model = Segment
exclude = ('seg_length_time_delta',
'seg_run_time',
'seg_run_time_delta' ,
'seg_remaining_time',
'seg_remaining_time_delta',
'program',
'audit_user',
)
def form_valid(self, form):
form.instance.audit_user = self.request.username
#request.user.username
return super().form_valid(form)
Шаблон выглядит так:
Изначально у меня было немного другое отображение ошибки - но я изменил его на этот блок ошибок, просто чтобы посмотреть, смогу ли я вывести что-нибудь безрезультатно.
Как вызвать форму с контекстом произошедших ошибок? Не совсем уверен, как это правильно сделать.
Спасибо
Я был на правильном пути - но мне не хватало нужных контекстных значений.
Решение:
Внутри моего views.py - нужно было добавить предыдущую форму в контекст, когда она недействительна, а затем отрисовать ее.
def form_invalid(self, form , **kwargs):
context = self.get_context_data(**kwargs)
context['form'] = form
return self.render_to_response(context)