python - 使用基于类的 View 提交表单集数据

标签 python django

我正在使用 django 创建一个包含子信息的表单集。我为此使用 createview (CBV)。表单显示正确,它具有添加子项和删除子项的功能,一切正常。但是,当我单击提交时,将调用 form_invalid 而不是 form_valid。为了了解这个问题,我打印了 form.errors 并且看到了以下错误

<ul class="errorlist"><li>deal_id<ul class="errorlist"><li>This field is required.</li></ul></li><li>child_name<ul class="errorlist"><li>This field is required.</li></ul></li><li>son_or_daugher<ul class="errorlist"><li>This field is required.</li></ul></li><li>child_age<ul class="errorlist"><li>This field is required.</li></ul></li><li>child_education<ul class="errorlist"><li>This field is required.</li></ul></li><li>child_occupation<ul class="errorlist"><li>This field is required.</li></ul></li></ul>

下面是我的代码

模板:-

{% extends "forms_app/base.html" %}
{% load static %}

{% block title %}{% endblock %}
{% block content %}
    <h2>Profile</h2>
    <hr>
    <div class="col-md-4">
        <form action="" method="post">{% csrf_token %}
            <table class="table">
                {{ childrens.management_form }}

                {% for form in childrens.forms %}
                    {% if forloop.first %}
                        <thead>
                        <tr>
                            {% for field in form.visible_fields %}
                                <th>{{ field.label|capfirst }}</th>
                            {% endfor %}
                        </tr>
                        </thead>
                    {% endif %}
                    <tr class="{% cycle row1 row2 %} formset_row">
                        {% for field in form.visible_fields %}
                            <td>
                                {# Include the hidden fields in the form #}
                                {% if forloop.first %}
                                    {% for hidden in form.hidden_fields %}
                                        {{ hidden }}
                                    {% endfor %}
                                {% endif %}
                                {{ field.errors.as_ul }}
                                {{ field }}
                            </td>
                        {% endfor %}
                    </tr>
                {% endfor %}
            </table>
            <input type="submit" value="Submit"/> <a href="">back to the list</a>
        </form>
    </div>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
    <script src="{% static 'forms_app/jquery.formset.js' %}"></script>
    <script type="text/javascript">
        $('.formset_row').formset({
            addText: 'Add Children',
            deleteText: 'Remove',
            prefix: 'familymember_set'
        });
    </script>
{% endblock %}

查看代码

class ChildrenView(CreateView):
    template_name = 'forms_app/children_form.html'
    form_class = ChildrenForm
    success_url = reverse_lazy('forms_app:deal-entering')

    # fields = ['name','class']

    def get_context_data(self, **kwargs):
        data = super(ChildrenView, self).get_context_data(**kwargs)
        if self.request.POST:
            data['childrens'] = ChildrenFormSet(self.request.POST)
        else:
            print('child form initial data')
            initial_list = []
            try:
                print('its going on')
                for i in range(self.request.session['children_count']   ):
                    print('still going on')
                    for field in self.fields:
                        initial_list.append(self.request.session[i + field])
                        data['childrens'] = ChildrenFormSet(initial = initial_list)
            except:
                data['childrens'] = ChildrenFormSet()
            # data['childrens'].extra = self.request.session['children_count']
        return data


    def form_valid(self, form):
        if form.is_valid():
            count = 0
            for f in form:
                for field in ['deal_id','child_name','son_or_daugher','child_age','child_education','child_occupation']:
                    self.request.session[count + field] = f.cleaned_data[field]
                count += 1

            self.request.session['children_count'] = count

            for i in range(count):
                for field in ['deal_id','child_name','son_or_daugher','child_age','child_education','child_occupation']:
                    print(self.request.session[i + field])


            for field in self.fields:
                self.request.session[field] = form.cleaned_data[field]

            self.request.session['valid_children'] = True

        return super(ChildrenView, self).form_valid(form)


    def form_invalid(self,form):

        if form.is_valid():
            pass
        print(form.errors)
        print('form invalid')
        return super(ChildrenView, self).form_invalid(form)

表单代码

class ChildrenForm(forms.ModelForm):
    class Meta:
        model = Children
        fields = '__all__'


    def clean(self):
        print(self.cleaned_data)

ChildrenFormSet = modelformset_factory(Children,fields = '__all__',extra=1)

我读过 StackOverflow 上的几篇文章。我浏览了 django 文档,但仍然无法找出问题所在。请帮我。

下面是我的表单的屏幕截图 enter image description here

如果您有任何理解问题,请评论,我会超快回复。

最佳答案

也许问题出在这一行:

form_class = ChildrenForm

尝试删除该行或将其更改为:

form_class = ChildrenFormSet

我认为您的 form_valid 正在对照 ChildrenForm 表单进行检查。

关于python - 使用基于类的 View 提交表单集数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57519413/

相关文章:

具有多线程的 Python 请求

Python 运算符 pymysql

python - Django 上静态 STATIC_URL 和 STATIC_ROOT 之间的区别

python - 在 Mac OS X 上安装支持 JPEG 的 PIL

django - 存储过程结果到 Django 模型

python - Django : Testing if the page has redirected to the desired url

python - 散点图矩阵,输入与输出

Python 请求模块和 JSON 响应

java - 用 JAVA 和 Python 编写的相同代码给出不同的结果(粒子滤波器)

python - 如何获取每个对象的 tastypie 中的动态字段