Можно ли добавить одну строку в форму Django? - PullRequest
2 голосов
/ 14 июля 2010

У меня есть такая форма:

class aForm(forms.Form):
  input1 = forms.CharField()
  input2 = forms.CharField()
  input3 = forms.CharField()

Я надеюсь добавить дополнительный ввод3 в форму, когда пользователь нажимает кнопку «добавить еще один ввод3».

Я прочитал несколько способов, которые позволяют мне добавлять новые формы с использованием наборов форм, но я не хочу добавлять новую форму, я просто хочу добавить новый input3.

Возможно ли это?

Ответы [ 3 ]

2 голосов
/ 14 июля 2010

для добавления динамических полей перезаписать метод init.

Примерно так:

class aForm(forms.Form):
  input1 = forms.CharField()
  input2 = forms.CharField()

  def __init__(self, addfields=0, *args, **kwargs):
    super(aForm, self).__init__(*args, **kwargs)

    #add new fields
    for i in range(3,addfields+3)
       self.fields['input%d' % i] = forms.CharField()
2 голосов
/ 14 июля 2010

Я бы определил input3 в вашем определении формы, не требуя его, а затем скрыл бы его по умолчанию.Затем пользователь может отобразить ввод с помощью JavaScript.

Если вы хотите, чтобы пользователь мог добавить неопределенное количество дополнительных входных данных, я бы подробнее изучил наборы форм.

0 голосов
/ 14 июля 2010

Возможно что-то вроде этого:

from django import forms
from django.utils.datastructures import SortedDict
def some_view(request):
    data = {}

    # Using session to remember the row count for simplicity
    if not request.session.get('form_rows', None):
        request.session['form_rows'] = 3

    # If posted with add row button add one more row
    if request.method == 'POST' and request.POST.get('rows', None):
            request.session['form_rows'] += 1
            data = request.POST

    # Create appropriate number of form fields on the fly
    fields = SortedDict()
    for row in xrange(1, request.session['form_rows']):
        fields['value_{0}'.format(row)] = forms.IntegerField()

    # Create form class
    MyForm = type('MyForm', (forms.BaseForm,), { 'base_fields': fields })

    form = MyForm(initial=data)

    # When submitted...
    if request.method == 'POST' and not request.POST.get('rows', None):
        form = MyForm(request.POST)
        if form.is_valid():
            # do something
    return render_to_response('some_template.html', {
        'form':form,
    }, context_instance=RequestContext(request))

С шаблоном:

<form action="" method="post">
    {{ form }}
    <input type="submit" />
    <input type="submit" value='Add' name='rows' />
</form>

Это слишком упрощенно, но работает.

Вы можете легко изменить этот пример, чтобы сделать запрос с помощью AJAX и просто заменить старую форму новой.

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