Я не вижу, как вызвать и получить cleaned_data из моего FormSetView. С набором форм django я бы вызвал is_valid()
для набора форм в ответе POST, но не уверен, как это сделать здесь. Приведенные в документации примеры не показывают этого, афаик.
Я реализовал именно так, как в примере с документацией django-extra-views. У меня уже есть ModelFormSetView, работающий нормально, хотя обновление БД в этом случае происходит автоматически. Тем не менее, в этом случае немодельной реализации очищенные данные обязательно должны быть преобразованы в другой формат для хранения БД.
Мое представление (вызывается из записи URL):
class TemplateFSView(FormSetView):
template_name = 'template_season.html'
form_class = TemplateForm
success_url = 'tee/home/'
def get_initial(self):
# initial data is a pre-load test for now...
return [{'commence': '07:30', 'finish': '22:00', "spacing": "10"]
def formset_valid(self, formset):
# do whatever you'd like to do with the valid formset
print('How do I get here?')
return super(TemplateFSView, self).formset_valid(formset)
Форма:
class TemplateForm(forms.Form):
commence = forms.CharField(required=True, label='first tee-time')
finish = forms.CharField(required=True, label='last tee-time')
spacing = forms.CharField(required=True, label='tee spacing')
Шаблон:
<form method="post">
{% csrf_token %}
<table>
{% for form in formset %}
{% if forloop.counter == 1 %}
<thead>
<tr>
<th scope="col">{{ form.commence.label_tag }}</th>
<th scope="col">{{ form.finish.label_tag }}</th>
<th scope="col">{{ form.spacing.label_tag }}</th>
</tr>
</thead>
{% endif %}
<tr>
<td>{{ form.commence }}</td>
<td>{{ form.finish }}</td>
<td>{{ form.spacing }}</td>
</tr>
{% endfor %}
</table>
{{ formset.management_form }}
<input type="submit" value="Submit" />
</form>