表单数据未绑定在 Django 中动态添加的内联表单集中

Napsterlicious

我有一个关于验证 Django 中动态添加的内联表单集的问题。似乎我在实现中遗漏了一些东西。

这是我的案例:我的项目是一个团队管理平台。一个团队称为 Crew,可以有多个时间表。每个计划可以有多个班次。请看一下我的代码。目前,如果所有字段都有效,我可以创建包含多个动态添加的轮班表单集表单的时间表。

如果不是,则不会显示 Shift 表单的错误,并再次填充初始数据。发送 POST 请求后,似乎轮班表格的数据没有绑定(因为 form.is_bound() 为 false)。此外,在 POST 请求后不再填充 Shift 表单的数据。您认为造成这种行为的原因是什么?我是否必须覆盖 is_valid 函数?我不知道,因为看起来该函数工作正常 - 数据只是没有正确绑定到新表单。

视图.py

def schedule_add(request, crew_id):
if request.method == "GET":
    form = ScheduleForm()
    ShiftFormSet = formset_factory(ShiftForm)
    return render(request, 'schedule_add2.html', {'form': form, 'formset': ShiftFormSet, 'title':"Zeitplan hinzufügen"})

elif request.method == "POST":
    form = ScheduleForm(request.POST)
    numberOfShifts = int(request.POST['form-TOTAL_FORMS'])
    ShiftFormSet = formset_factory(ShiftForm, extra=numberOfShifts)
    shift_formset = ShiftFormSet(request.POST, prefix='form')
    print(request.POST)
    if form.is_valid() and shift_formset.is_valid():
        schedule = Schedule()
        schedule.name = form.cleaned_data.get('name')
        schedule.crew = Crew.objects.get(pk=crew_id)
        schedule.location = form.cleaned_data.get('location')
        schedule.subperiod = form.cleaned_data.get('sub_period')
        schedule.save()

        for shift_form in shift_formset:
            if shift_form.is_valid():
                shift = Shift()
                shift.min_user_count = shift_form.cleaned_data.get('min_user_count')
                shift.max_user_count = shift_form.cleaned_data.get('max_user_count')
                shift.start_datetime = shift_form.cleaned_data.get('start_time')
                shift.end_datetime = shift_form.cleaned_data.get('end_time')
                shift.schedule = schedule
                shift.save()
        messages.success(request, 'Zeitplan & Schichten angelegt.')

        return redirect('shifter:crew_view', crew_id=crew_id)
    else:
        messages.error(request, 'Fehler')

    return render(request, 'schedule_add2.html', {'form': form, 'formset': ShiftFormSet, 'title':"Zeitplan hinzufügen"})
else:
    return redirect('shifter:index')

表格.py

class ScheduleForm(forms.ModelForm):
name = forms.CharField(max_length=30, required=True, help_text='', label="Name")
sub_period = forms.ModelChoiceField(queryset=SubPeriod.objects.all(), empty_label=None, label="Tag")
location = forms.ModelChoiceField(queryset=Location.objects.all(), empty_label=None, label="Einsatzort")

class Meta:
    model = Schedule
    fields = ('name', 'sub_period', 'location',)

class ShiftForm(forms.ModelForm):
    min_user_count = forms.IntegerField(required=True, help_text='', label="Min Count", initial=2)
    max_user_count = forms.IntegerField(required=True, help_text='', label="Max Count", initial=4)
    start_time = forms.DateTimeField(required=True, help_text='', label="Shift start", initial=datetime.now)
    end_time = forms.DateTimeField(required=True, help_text='', label="Shift end", initial=datetime.now)

    class Meta:
        model = Shift
        fields = ('start_time','end_time','min_user_count','max_user_count',)

模板

<form method="post">
            {% csrf_token %}

            {% if form.non_field_errors %}
                <div class="alert alert-danger" role="alert">
                  {% for error in form.non_field_errors %}
                    {{ error }}
                  {% endfor %}
                </div>
            {% endif %}

            {% for field in form.visible_fields %}
                {{ field.label_tag }}
                {% if form.is_bound %}
                    {% if field.errors %}
                      {% render_field field class="form-control is-invalid" %}
                      {% for error in field.errors %}
                        <div class="invalid-feedback">
                          {{ error }}
                        </div>
                      {% endfor %}
                    {% else %}
                      {% render_field field class="form-control is-valid" %}
                    {% endif %}
                  {% else %}
                    {% render_field field class="form-control" %}
                  {% endif %}

                  {% if field.help_text %}
                    <small class="form-text text-muted">{{ field.help_text }}</small>
                  {% endif %}
            {% endfor %}

            <h2 class="mt-5">Shifts</h2>
            <table class="table">
                {{ formset.management_form }}

                {% for form in formset.forms %}
                    {% if forloop.first %}
                        <thead>
                        <tr>
                            {% for field in form.visible_fields %}
                                <th>{{ field.label|capfirst }}</th>
                            {% endfor %}
                            <th></th>
                        </tr>
                        </thead>
                    {% endif %}
                    <tr class="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 %}
                                {% if form.is_bound %}
                                    {% if form.errors %}
                                        {% render_field field class="form-control is-invalid" %}
                                        {% for error in form.errors %}
                                            <div class="invalid-feedback">
                                              {{ error }}
                                            </div>
                                        {% endfor %}
                                    {% else %}
                                        {% render_field field class="form-control is-valid" %}
                                    {% endif %}
                                {% else %}
                                    {% render_field field class="form-control" %}
                                {% endif %}
                            </td>
                        {% endfor %}
                        <td></td>
                    </tr>
                {% endfor %}
            </table>
            <button type="submit" class="btn btn-primary">Save</button>
        </form>

提前致谢,克里斯托弗

丹尼尔罗斯曼

您将类 , 返回ShiftFormSet到模板(在代码的倒数第三行)而不是实例shift_formset

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

动态地在formset中创建django表单,就像使用jQuery在django admin中的内联表单一样

来自分类Dev

以正确的方式使用javascript将动态表单添加到Django表单集中

来自分类Dev

使用Javascript将表单动态添加到Django表单集中

来自分类Dev

Django:如何添加动态类以选择表单中的选项

来自分类Dev

Django / Python:表单数据未存储在数据库中

来自分类Dev

在Django中向表单动态添加新字段

来自分类Dev

在Django中将除表单数据外的数据添加到数据库中

来自分类Dev

django admin-如何覆盖内联表单集中的添加新行

来自分类Dev

Django表单数据未保存到databsae中

来自分类Dev

表单数据绑定失败

来自分类Dev

HTML表单数据未保存在数据库中-Django

来自分类Dev

无法删除Django中的表单表单内联表单集

来自分类Dev

amp表单未提交表单数据

来自分类Dev

request.POST不读取Django中的表单数据

来自分类Dev

Django密码显示在表单数据中(发布/请求)

来自分类Dev

Django表单未保存数据

来自分类Dev

表单数据在哪里处理?(Django)

来自分类Dev

Django:清理表单数据?

来自分类Dev

Django:如何在后端的受限表单集中添加表单?

来自分类Dev

数组中的Django表单数据

来自分类Dev

django-检查请求中是否存在表单数据

来自分类Dev

Django无法处理html表单数据

来自分类Dev

表单数据未保存在 django 中

来自分类Dev

未保存Django模型表单数据

来自分类Dev

了解内联表单集中的 Django 外键关系

来自分类Dev

Django html 表单数据抛出 NoReverseMatch

来自分类Dev

在 Django 数据库中插入表单数据

来自分类Dev

在表单集中添加的每个新输入元素的 Django 动态表单增量 ID

来自分类Dev

Django不保存表单数据

Related 相关文章

热门标签

归档