代码之家  ›  专栏  ›  技术社区  ›  NotSimon

是否可以在Django窗体中添加一行?

  •  2
  • NotSimon  · 技术社区  · 14 年前

    我有一个表格大致如下:

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

    我希望在用户单击“addanotherinput3”时向表单添加一个额外的input3。

    3 回复  |  直到 14 年前
        1
  •  2
  •   maersu    14 年前

    如果要添加动态字段,请覆盖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
  •  2
  •   Zach    14 年前

    我会定义 input3 在表单定义中,不需要它,然后默认隐藏它。然后用户可以使用JavaScript显示输入。

        3
  •  0
  •   Davor Lucic    14 年前

    也许是这样的:

    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发出请求,并用新表单替换旧表单。