Использования Django 1.4, у меня есть ModelFormSet без каких-либо начальных случаев и дополнительным и максимального набором 6:Джанго ModelFormSet возвращается с ошибками, необходимо отобразить все формы, кроме пустых
# forms.py
ChildFormSet = modelformset_factory(Child, formset=FirstRequiredModelFormSet, exclude=('family_application', 'exported', 'index',), extra=6, max_num=6)
child_queryset = Child.objects.none()
Когда пользователь первых визиты на странице я использую jquery, чтобы показать только одну пустую форму (набор полей). Пользователь может нажать кнопку, чтобы отобразить остальные формы. Если форма возвращается с ошибками проверки, я могу использовать jquery, чтобы найти поля, у которых есть список ошибок классов, и показать все эти поля. Однако я также хочу показать любые поля, содержащие достоверные данные. Я мог бы проверить все элементы в каждом поле, чтобы увидеть, есть ли у них значения, но это кажется неуклюжим. Django знает, когда форма изменилась, так что я бы добавить префикс к тем формам, так что я мог обнаружить их в HTML:
class FirstRequiredModelFormSet(BaseModelFormSet):
def __init__(self, *args, **kwargs):
super(FirstRequiredModelFormSet, self).__init__(*args, **kwargs)
self.forms[0].empty_permitted = False
def clean(self):
super(FirstRequiredModelFormSet, self).clean()
for form in self.forms:
if form.has_changed():
form.prefix = '-'.join(('modified', form.prefix))
Проблема в том, что способ, которым я переопределение чистый() каким-то образом приводит к тому, что представленные данные теряются, когда форма возвращается с ошибками (возвращается без исходных данных). Если я вернусь рано, проверяя ошибки проверки первых, как это:
def clean(self):
if any(self.errors):
return
super(FirstRequiredModelFormSet, self).clean()
for form in self.forms:
if form.has_changed():
form.prefix = '-'.join(('modified', form.prefix))
, данные по-прежнему есть, но, конечно, то префикс не добавляется. Я думал об использовании is_bound вместо has_changed(), но кажется, что все формы связаны с самого начала, я предполагаю, потому что они ModelForms.
Любые идеи, почему переопределение BaseModelFormSet.clean() для добавления префиксов приводит к потере исходных данных возвращенной формы?
Вы возвращаетесь self.cleaned_data в конце вашего переопределения? – jondykeman
Нет, вам не нужно использовать ModelFormSet. По умолчанию реализация просто проверяет, что новые объекты не нарушают уникальные ограничения модели. – Kevin