【问题标题】:Django form is not valid because of empty POST由于 POST 为空,Django 表单无效
【发布时间】:2014-09-08 01:58:06
【问题描述】:

我的 django 表单无效。我猜这是因为 request.POST 几乎是空的(仅包含 csrf_token)。我仍然找不到原因。寻求帮助。

附: (为了清楚起见,代码中发生了什么)我有三个级别的级联类别和一个模式列表。我想用一个类别标记所有模式。 select2 的选项取决于 select1 中选择的选项。 select3 也是如此。

形式:

class AddPatternForm(forms.Form):
    category_1 = forms.ChoiceField()
    category_2 = forms.ChoiceField(required=False)
    category_3 = forms.ChoiceField(required=False)
    patterns = forms.CharField()

    def verify(self):
        valid = []
        invalid = []
        patterns = self.patterns.split('\n')
        for pattern in patterns:
            if VALID_DOMAIN.match(pattern):
                valid.append(get_domain(pattern))
            elif VALID_REGEXP.match(pattern):
                valid.append(pattern)
            else:
                invalid.append(pattern)
        return valid, invalid

观点:

def add_pattern(request):
    patterns = Url.objects.all()
    parents = Category.objects.filter(parent=None)
    if request.method == 'POST':
         form = AddPatternForm(request.POST)
         if form.is_valid():
             valid, invalid = AddPatternForm.verify()
             if form.category_3:
                 parent_id = form.category_3
             elif form.category_2:
                 parent_id = form.category_2
             else:
                 parent_id = form.category_1
             parent = Category.objects.get(pk=parent_id)
             for pattern in valid:
                 Url(pattern=pattern, categories=parent).save()
             return HttpResponseRedirect('')
     else:
         form = AddPatternForm()

     return render(request, 'app/add_pattern.html', {
        'form': form,
        'patterns': patterns,
        'parents': parents,
    })

html:

      <form id="chooseCategory" method="post" action="">
        {% csrf_token %}
        <div class="form-group">
          <h2 id="chosenCategory">Категория: </h2>
          <select id="select1" class="form-control">
            <option value="">---</option>
            {% for parent in parents %}
            <option value="{{ parent.id }}">
              {{ parent }}
            </option>
            {% endfor %}
          </select>
            <option value="">---</option>
          <select id="select2" class="form-control">
          </select>
            <option value="">---</option>
          <select id="select3" class="form-control">
          </select>
        </div>
        <div class="form-group">
          <textarea class="form-control" rows="5"></textarea>
        </div>
        <button type="submit" class="btn btn-default">Save</button>
      </form>

JS(实现级联下拉选择):

$( "#select1" ).change(function () {
          var str = "Категория: ";
          $( "#select1 option:selected" ).each(function() {
            str += $( this ).text() + " ";
          });
          $( "#chosenCategory" ).text( str );
          $( "#select2" ).find('option').remove().end()
          $( "#select2" ).append("<option value=''>---</option>")
          $.get("/load_new_options/", {"parent_id": $( "#select1 option:selected" ).val()},
          function(data) {
            var c = JSON.parse(data);
            for (i in c) {                
              $( "#select2" ).append("<option value='" + c[i].pk + "'>" + c[i].fields.name + "</option>")
            }
          })
        })
        .change();


        $( "#select2" ).change(function () {
          var str = "Категория: ";
          $( "#select2 option:selected" ).each(function() {
            str += $( this ).text() + " ";
          });
          $( "#chosenCategory" ).text( str );
          $( "#select3" ).find('option').remove().end()
          $( "#select3" ).append("<option value=''>---</option>")
          $.get("/load_new_options/", {"parent_id": $( "#select2 option:selected" ).val()},
          function(data) {
            var c = JSON.parse(data);
            for (i in c) {                
              $( "#select3" ).append("<option value='" + c[i].pk + "'>" + c[i].fields.name + "</option>")
            }
          })
        })
        .change();

        $( "#select3" ).change(function () {
          var str = "Категория: ";
          $( "#select3 option:selected" ).each(function() {
            str += $( this ).text() + " ";
          });
          $( "#chosenCategory" ).text( str );
        })
        .change();

        $('#chooseCategory').cascadingDropdown({
            selectBoxes: [
                {
                    selector: '#select1',
                },
                {
                    selector: '#select2',
                    requires: ['#select1'],
                },
                {
                    selector: '#select3',
                    requires: ['#select1', '#select2'],
                    requireAll: true,
                    onChange: function(){
                    }
                }
            ]
        });

UPD 表格仍然无效。 form.errors 如下所示:

category_3
Select a valid choice. 19 is not one of the available choices.
category_2
Select a valid choice. 4 is not one of the available choices.
category_1
Select a valid choice. 1 is not one of the available choices.

【问题讨论】:

    标签: django forms django-forms


    【解决方案1】:

    别猜了。输出模板中的错误,你就知道它为什么无效了。

    {{ form.errors }}
    

    编辑 您没有在表单域元素中添加任何name 属性。如果字段有名称,浏览器只会在表单提交上发送数据,因为这就是与数据相关联的内容。

    您确实应该使用 Django 表单来输出字段,而不是手动创建 HTML。

    【讨论】:

    • 输出:patterns 此字段为必填项。 category_1 此字段为必填项。
    • 我在表单中正确输入数据并按提交,但它认为没有输入任何数据。
    • 我现在已经添加了名称属性,稍后将按照您的建议使用 Django 表单输出字段。表单验证仍然存在问题。我已将 form.errors 添加到帖子的末尾
    猜你喜欢
    • 1970-01-01
    • 2017-10-13
    • 2013-09-14
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2018-07-02
    相关资源
    最近更新 更多