Добавление новых форм в набор форм Django на основе данных POST - PullRequest
2 голосов
/ 22 декабря 2009

Я пытаюсь заполнить набор форм Django, используя данные из запроса POST. Я могу правильно отобразить набор форм и создать его экземпляр в основном нормально, но у меня возникла проблема, когда набор заканчивается двумя пустыми строками в конце, что нежелательно. Ниже приведена функция, которую мы использовали в views.py:

forms.py

class DepositForm(forms.Form):
    InsID = forms.IntegerField()
    DepositTypeID = forms.IntegerField()
    DepositAmount = forms.IntegerField()
    Account = forms.IntegerField()

DepositFormSet = formset_factory(DepositForm, extra=1)

views.py

def _DepositEditor(request, c):
    if request.POST.has_key('form-0-InsID'):
        formset = DepositFormSet(request.POST)
        if formset.is_valid(): 
            formset = DepositFormSet(initial=formset.cleaned_data)
    else:
        formset = DepositFormSet()
    c['formset'] = formset

    return render_to_response('deposits/dep.html', c)

dep.html

<form action="" method="post">  

{{formset.management_form}}
{% for form in formset.forms %}
    {{form.errors }}
    {% for field in form %}
        {{field.label}}: {{field}}
    {% endfor %}
  <br />
{% endfor %}

<input type="submit" name="add" value="Add Deposit"></input>

</form>

Это должен быть весь соответствующий код. В любом случае, шаблон отображает весь набор форм, который должен содержать пустую строку (или, в случае ошибки, не пустые строки, а сообщения об ошибках над последней строкой). Проблема возникает, когда вы нажимаете «Добавить» с последней пустой строкой. В коде он все еще передает formset.is_valid (), поэтому он создает новый набор форм с дополнительным полем. Если вы нажмете «Добавить здесь», он вернется с ошибками, но все же позволит вам заполнить все строки, кроме последней, и создать правильный набор форм. Есть ли способ сообщить моему набору форм, что пустые формы не пройдут проверку? Или в качестве альтернативы есть лучший способ сделать это? В конечном итоге планируется, что на странице будут интегрированы некоторые jquery, так что пока это не идеально, если есть хороший способ решения этой проблемы с использованием инструментов jquery, которые, вероятно, будут достаточно хорошими. Большое спасибо!

Ответы [ 2 ]

2 голосов
/ 22 декабря 2009

В ваших views.py:

-            formset = DepositFormSet(initial=formset.cleaned_data)
+            data = formset.cleaned_data
+            if data[-1]=={}:
+                data=data[:-1]
+            formset = DepositFormSet(initial=data)

Это выглядит скорее как функция, чем как ошибка;)

1 голос
/ 19 декабря 2010

Я сам этого не делал, но если вы действительно хотите сделать его недействительным с пустой записью, возможно, вы бы подумали поместить его в чистый метод:

http://docs.djangoproject.com/en/dev/topics/forms/formsets/#custom-formset-validation

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...