Django 管理表单失败,因为“form-TOTAL_FORMS”和“form-INITIAL_FORMS”未正确填充

2024-06-11

信息:

我想创建嵌套表单,通过以下位置提供的示例进行最好的描述:

http://yergler.net/blog/2009/09/27/nested-formsets-with-django/ http://yergler.net/blog/2009/09/27/nested-formsets-with-django/

此页面上的教程似乎相当不错&&它正在尝试解决我遇到的确切问题。

当没有 POST 请求数据时(即我们正在从数据库执行初始填充),views.py 文件中的此实现似乎存在问题。

可以在上面提供的 URL 中看到代码(如果需要,我可以发布一些代码,但我担心它会剥夺此处提供的信息)。

这是失败的views.py 代码(以粗体显示):

block = get_object_or_404(models.Block, id=block_id)

if request.method == 'POST':
    formset = forms.BuildingFormset(request.POST, instance=block)

    if formset.is_valid():
        rooms = formset.save_all()

        return redirect('block_view', block_id=block.id)

else:
    formset = forms.BuildingFormset(instance=block)  #This is the line that is throwing the ValidationError 

我收到的错误消息是:

ValidationError at "urlName":
[u'ManagementForm data is missing or has been tampered with']

我进行了更深入的挖掘,看来此故障发生在 site-packages/django/forms/formsets.py 行

The is_valid()检查失败,因为某些管理表单所需的数据(form-TOTAL_FORMS、form-INITIAL_FORMS 和 form-MAX_NUM_FORMS)无效。以下是 self.errors 的实际输出:

{u'TOTAL_FORMS': [u'This field is required.'], u'INITIAL_FORMS': [u'This field is required.']}

Code:

edit_building.html:

{{ Buildings.management_form }}

{% for Buildings.forms %}

 {{ building }}

 {% if building.nested %}   
   {% for formset in building.nested %}   
     {{ formset.as_table }}   
   {% endfor %}   
 {% endif %}

{% 结束 %}

视图.py:

def should_delete(self, form):
    """Convenience method for determining if the form’s object will
    be deleted; cribbed from BaseModelFormSet.save_existing_objects."""

    if self.can_delete:
        raw_delete_value = form._raw_value(DELETION_FIELD_NAME)
        should_delete = form.fields[DELETION_FIELD_NAME].clean(raw_delete_value)
        return should_delete

    return False

def save_all(self, commit=True):
    """Save all formsets and along with their nested formsets."""

    # Save without committing (so self.saved_forms is populated)
    # — We need self.saved_forms so we can go back and access
    #    the nested formsets
    objects = self.save(commit=False)

    # Save each instance if commit=True
    if commit:
        for o in objects:
            o.save()

    # save many to many fields if needed
    if not commit:
        self.save_m2m()

    # save the nested formsets
    for form in set(self.initial_forms + self.saved_forms):
        if self.should_delete(form): continue

        for nested in form.nested:
            nested.save(commit=commit)

形式.py:

def should_delete(self, form):
    """Convenience method for determining if the form’s object will
    be deleted; cribbed from BaseModelFormSet.save_existing_objects."""

    if self.can_delete:
        raw_delete_value = form._raw_value(DELETION_FIELD_NAME)
        should_delete = form.fields[DELETION_FIELD_NAME].clean(raw_delete_value)
        return should_delete

    return False

def save_all(self, commit=True):
    """Save all formsets and along with their nested formsets."""

    # Save without committing (so self.saved_forms is populated)
    # — We need self.saved_forms so we can go back and access
    #    the nested formsets
    objects = self.save(commit=False)

    # Save each instance if commit=True
    if commit:
        for o in objects:
            o.save()

    # save many to many fields if needed
    if not commit:
        self.save_m2m()

    # save the nested formsets
    for form in set(self.initial_forms + self.saved_forms):
        if self.should_delete(form): continue

        for nested in form.nested:
            nested.save(commit=commit)

Notes:

  • 我已经查看了 django 文档https://docs.djangoproject.com/en/dev/topics/forms/formsets/#understanding-the-managementform https://docs.djangoproject.com/en/dev/topics/forms/formsets/#understanding-the-managementform并没有发现任何太有用的内容来讨论 DJANGO 如何自动填充这些值

  • 我正在使用 Django V1.5

问题:

如果没有POST数据,而表单只是从数据库生成,那么如何正确填写'form-TOTAL_FORMS' && 'form-INITIAL_FORMS'数据来解决此故障?


Update:

看完之后这个例子 http://yergler.net/blog/2009/09/27/nested-formsets-with-django/你提供了一个像这样的片段forms.py在结束时add_fields() method:

# store the formset in the .nested property
form.nested = [
    TenantFormset(data = self.data,
                  instance = instance,
                  prefix = 'TENANTS_%s' % pk_value)
]

The data参数会引起问题,因为它最初是空的,并且 Django 内部将确定是否是一个表单is bound https://docs.djangoproject.com/en/dev/ref/forms/api/#bound-and-unbound-forms通过类似于以下的条件:

self.is_bound = data is not None

# Example
>>> my_data = {}
>>> my_data is not None
True

正如你所看到的,Python 中的空字典不是 None,所以你的TenantFormset被视为bound形式,尽管它不是。您可以使用类似以下内容来修复它:

# store the formset in the .nested property
form.nested = [
    TenantFormset(data = self.data if any(self.data) else None,
                  instance = instance,
                  prefix = 'TENANTS_%s' % pk_value)
]

您可以发布视图和表单代码以及表单的模板代码吗?

我的猜测是,您没有在模板中使用“management_form”(它添加了您缺少的“form-TOTAL_FORMS”和“form-INITIAL_FORMS”字段),即

<form method="post">
    {{ formset.management_form }}
    <table>
        {% for form in formset %}
        {{ form }}
        {% endfor %}
    </table>
</form>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django 管理表单失败,因为“form-TOTAL_FORMS”和“form-INITIAL_FORMS”未正确填充 的相关文章

随机推荐

  • 使用 javascript 暂停 CSS 动画并跳转到动画中的特定位置

    我有一个完全用CSS动画构建的无尽滑块 我希望能够使用javascript onlcick和键盘输入 来操纵动画 我希望能够从一帧快速运行动画 即加速到另一帧 以便在按下引用滑块中特定图像的按钮时产生跳跃效果 另外 我希望能够通过键盘输入逐
  • 如何以编程方式自定义 Eclipse 透视图?

    我想要做出与右键单击透视图并选择自定义以获得此窗口时相同的行为 我想仅以编程方式为我的视角自定义菜单和工具栏 实际上 我只想删除我的视角中的大多数菜单和工具栏 并在我更改为任何其他视角时让它们再次显示 你能帮我解决这个问题吗 This ht
  • 如何使用 svnkit 列出本地修改/未版本化的文件?

    我正在编写一段代码 一旦在 SVN 工作副本中的任何位置执行 就会找到根目录 File workingDirectory new File getCanonicalFile File wcRoot SVNWCUtil getWorkingC
  • 当 Node.js 作为脚本运行时,“this”的上下文是什么? [复制]

    这个问题在这里已经有答案了 从节点 REPL node gt var x 50 gt console log x 50 gt console log this x 50 gt console log this global true 一切都
  • 无法导入 python-mysqldb

    我使用安装了 python mysqldb sudo apt get install python mysqldb 我尝试使用它但没有成功 以下命令在 Python 提示符下不起作用 import python mysqldb Or imp
  • 使用Android WebView时JavaScript异常在哪里显示?

    我有一个简单的 HTML 我将其加载到 Android WebView SDK 版本 1 5 中 h1 Hello World h1 函数 nomethod 不存在 但 LogCat 不显示任何错误 似乎任何未捕获的异常都无法追踪 知道如何
  • 为贝塞尔曲线中的每个点绘制切线

    我设法绘制了一条贝塞尔曲线 如下所示 glColor3f 0 1 0 glBegin GL LINE STRIP for int i 3 i lt nPt i 3 glColor3f 0 0 0 for float k 0 k lt NLI
  • React hook useEffect 永远/无限循环地持续运行

    我正在尝试新的反应钩子 https reactjs org docs hooks intro html s useEffectAPI 似乎永远在无限循环中运行 我只想回调useEffect运行一次 这是我的代码供参考 单击 运行代码片段 可
  • Java 能够选择是加还是减

    我有两个问题 第一是为什么我不能添加运算符 我可以添加第一个和第二个整数 但不能添加运算符 第二个问题是我需要创建一个永无止境的循环 有没有比 while 循环更简单的方法 基本上的想法是 如果他们选择 如果会说错误的运算符 请重试 imp
  • 如何在 Windows 上使用 freeType 构建 rgl

    我正在尝试 并且非常失败 建立rgl封装有freeType在 Windows 上 因为事实证明 rgl我通过 Rgui 安装的 Windows 二进制文件不包括freeType支持 我需要它的原因是this https stackoverf
  • int[]... 数组在 Java 中意味着什么?

    你能帮助我吗 int 数组在 Java 中意味着什么 例子 public static int concat int arrays int length 0 for int array arrays length array length
  • 如何在 R 中建立具有某些条件的排列[重复]

    这个问题在这里已经有答案了 我是 R 新手 有点困惑 假设我有一个向量 c 1 2 3 4 5 6 我想生成具有四个元素的排列 每个排列应涉及 1 和 5 谢谢 您可以使用permutations https www rdocumentat
  • CSS动画比JS动画快吗?

    前段时间读到一篇文章说CSS动画比JS动画快 使用 jQuery 做了一些动画后 我可以理解为什么有些人会这么说 因为 jQuery 动画有时会出现错误并且速度很慢 但我想知道的是 这个论点是否有任何核心事实 有一种常见的误解 认为 CSS
  • NodeJS 与 DynamoDB 抛出错误“AttributeValue 可能不包含空字符串”

    我遇到了一个问题 因为 DynamoDB 无法接受空字符串作为属性中的值 我总是必须在前端检查是否存在空字符串值 否则 API 调用将由于 Dynamo DB 抛出的错误 An AttributeValue 可能不包含空字符串 而失败 我想
  • DefaultHttpClient GET 和 POST 命令 Java Android

    好的 这是我的应用程序 一个 Android 应用程序 允许我从移动应用程序 而不是从网站 将 CokeZone 代码提交到 CokeZone co uk 所以我编写了这部分代码来执行登录后命令 然后检查我是否登录后 问题是 发送 post
  • 每当我打开文档时,VBA 代码就会停止

    首先 很抱歉发布此内容 我知道它可能是重复的this https stackoverflow com questions 51625995 vba code stops after documents open帖子 我试图将其作为编辑发布
  • Web 语音 API - SpeechGrammar

    所以我在浏览 Web Speech API 文档时发现了这个 https dvcs w3 org hg speech api raw file tip speechapi html speechreco speechgrammar http
  • Signed Char 到 Unsigned Int 转换的标准 C++ 行为

    我快速浏览了 C 03 标准 但仍然无法判断这种行为是否得到保证 signed char cNegOne 1 char is 8bits unsigned int a cNegOne int is 32 bits in my Windows
  • 转义字符串中的引号

    我有一个 python 字典 例如 pk 1 name John size 1 4 etc 该尺寸为 1 4 英寸 我如何 转义 该引用 所以它仍然会显示为 1 4 它是一个列表 所以我不能像这样手动编码1 4 我试过replace 编辑
  • Django 管理表单失败,因为“form-TOTAL_FORMS”和“form-INITIAL_FORMS”未正确填充

    信息 我想创建嵌套表单 通过以下位置提供的示例进行最好的描述 http yergler net blog 2009 09 27 nested formsets with django http yergler net blog 2009 0