【问题标题】:why do I get a single field value in Django formset_factory?为什么我在 Django formset_factory 中获得单个字段值?
【发布时间】:2020-10-29 14:36:56
【问题描述】:

当我检查 formset_factory 验证并从 formset 中获取字段值时,它仅返回来自 formset 的一个字段值。但我在我的代码中找不到任何问题。请帮我解决问题。

我的form.py:

class SbTitleForm(forms.Form):
    sb_title = forms.CharField(required=False)
    sb_permission = forms.BooleanField(required=False)

SbTitleFormSet = formset_factory(SbTitleForm, extra=0)

我的观点.py:

def menuuser(request):
    sbtitle = SbTitle.objects.all().values()
    sbtitle_form = SbTitleFormSet(initial=sbtitle)
    if request.method == 'POST':
        sbtitle_form = SbTitleForm(request.POST, initial=sbtitle)
        if sbtitle_form.is_valid():
            print(sbtitle_form.cleaned_data)
            
    context = {
        'sbtitle_form':sbtitle_form,
    }
    return render(request, 'admins/user_role/user_permission.html', context)

我的 HTML:

{% extends 'base/base.html' %} 
{% load static %} 
{% block content %}
<div class="card">
    <form class="form-horizontal" action="" method="post">
    {% csrf_token %}
    {{ sbtitle_form.management_form }}
    {{ sbitleelement_form.management_form }}
    <div id="DataTables_Table_2_wrapper" class="dataTables_wrapper no-footer">
        <div class="datatable-scroll">
            <table class="table table-bordered table-hover datatable-highlight dataTable no-footer" id="DataTables_Table_2" role="grid" aria-describedby="DataTables_Table_2_info">
                <thead>
                    <tr role="row" class="bg-teal-400">
                        <th class="sorting text-center h5" tabindex="0" aria-controls="DataTables_Table_2" rowspan="1" colspan="1" aria-label="Job Title: activate to sort column ascending">Sidebar Title</th>
                    </tr>
                </thead>
                <tbody>
                    {% for field in sbtitle_form %}
                    <tr role="row" class="odd">
                        <td class="sorting_1 text-center"><h4>{{ field.sb_title.value }} {{ field.sb_permission }}<p class="text-danger">{{ field.errors.as_text }}</p></h4></td>
                    {% endfor %}
                </tbody>
            </table>
        </div>
        <div class="card-footer">
            <button class="btn btn-lg btn-primary" type="submit">Save</button>
        </div>
    </div>
    </form>
</div>
{% endblock %}

当我尝试 print(sbtitle_form.cleaned_data) 时,它只返回一个字段值,例如 {'sb_title': '', 'sb_permission': False}。我无法在表单集中获取其他字段值。请帮我解决问题。

【问题讨论】:

  • sbtitle_form = SbTitleForm(request.POST, initial=sbtitle) 应该是sbtitle_form = SbTitleFormSet(request.POST, initial=sbtitle)

标签: python django django-views django-forms django-templates


【解决方案1】:

sbtitle_form = SbTitleForm(request.POST, initial=sbtitle)

应该是:

sbtitle_form = SbTitleFormSet(request.POST, initial=sbtitle)

def menuuser(request):
    sbtitle = SbTitle.objects.all().values()
    sbtitle_form = SbTitleFormSet(initial=sbtitle)
    if request.method == 'POST':
        sbtitle_form = SbTitleFormSet(request.POST, initial=sbtitle) # <----
        if sbtitle_form.is_valid():
            print(form.cleaned_data)
    context = {
        'sbtitle_form':sbtitle_form,
    }
    return render(request, 'admins/user_role/user_permission.html', context)

如果您想访问每个表单:

def menuuser(request):
    sbtitle = SbTitle.objects.all().values()
    sbtitle_form = SbTitleFormSet(initial=sbtitle)
    if request.method == 'POST':
        sbtitle_form = SbTitleFormSet(request.POST, initial=sbtitle)
        if sbtitle_form.is_valid():
            for form in sbtitle_form.forms:  # <----
                print(form.cleaned_data)
    context = {
        'sbtitle_form':sbtitle_form,
    }
    return render(request, 'admins/user_role/user_permission.html', context)

【讨论】:

  • 我现在遇到了另一个问题。当我单击提交按钮时, {% for field in sbtitle_form %} 循环会在 HTML 模板中继续一个额外的 5,结果类似于 {'sb_title': '', 'sb_permission ':真} {'sb_title':'','sb_permission':假} {'sb_title':'','sb_permission':假} {'sb_title':'','sb_permission':假} {'sb_title' : '', 'sb_permission': False} {'sb_title': '', 'sb_permission': False} {'sb_title': '', 'sb_permission': False} {'sb_title': '', 'sb_permission':错误}。为什么要这样做?
猜你喜欢
  • 2023-04-06
  • 2013-10-21
  • 2011-08-19
  • 1970-01-01
  • 2014-04-23
  • 2011-12-29
  • 1970-01-01
  • 2020-06-07
  • 2021-04-11
相关资源
最近更新 更多