2013-02-16 1 views
0

Использования 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() для добавления префиксов приводит к потере исходных данных возвращенной формы?

+0

Вы возвращаетесь self.cleaned_data в конце вашего переопределения? – jondykeman

+0

Нет, вам не нужно использовать ModelFormSet. По умолчанию реализация просто проверяет, что новые объекты не нарушают уникальные ограничения модели. – Kevin

ответ

0

Когда браузер отправляет формы обратно на сервер, Django использует префикс, чтобы определить, какая форма принадлежит этому объекту Child. Я думаю, что вы возитесь с этой системой, добавив свой собственный префикс.

Я бы предложил использовать другую систему для идентификации модифицированных форм. Я думаю, что вы должны быть в состоянии использовать метод has_changed() в шаблоне, так что вы могли бы сделать что-то вроде -

<form class="{% if form.has_changed %}changed{% endif %}"> 

(обратите внимание на отсутствие скобок при вызове метода в шаблоне).

+0

Я не понимал, что могу использовать методы формы из шаблона. Если это сработает, это все равно будет более чистым решением. Я попробую в понедельник. – Kevin

+0

Предполагая, что вы имели в виду form.has_changed, это работает. Спасибо Айдану! – Kevin

+0

Без проблем, рад помочь. –