问题标签 [inline-formset]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - Django 内联表单集和选择字段生成太多数据库查询
我有一个带有许多外键字段的模型,例如带有字段“类型”、“级别”、“颜色”、“强度”的模型产品(只是一个通用示例)。
然后,我有一个页面可以使用 Type 表单编辑给定类型的所有产品,其中产品作为内联表单集,并可选择使用extra=10
.
我觉得很奇怪的是,每次我在模板上输出一个外键选择字段时,Django 都会查询数据库以获取选项(每次)。
例如:
对于 20 个产品(和 10 个空的额外表单),上面的代码select * from ...
从级别、颜色和强度发出 30 个,总共 90 个查询(使用 Django 调试工具栏显示),其中 3 个应该足够了。这些选项不太可能在请求中更改,但即使他们这样做了,我也绝对不希望某些新添加的选项仅出现在最后 5 个表单中。
有什么方法可以优化我的模型/表单/视图/模板,以使数据库不会像这样不必要地受到冲击?
-
免责声明:我对 django 和 python 比较陌生,并且不禁想到必须有一种方法可以以某种方式解决这个问题。
django - 在 Django Admin Inlines 中为不可编辑字段设置初始值
我的网站支持多种语言。我有一个对象 (Category),它应该有 1 个或多个翻译对象 (CategoryTranslation) 对应于支持的语言(它们不是那么简单,所以请不要建议使用翻译应用程序)。此外,依赖对象具有指向创建和最后更新它们的用户的链接。
我想在我的类别管理面板中关注:
- 类别字段。
- 由现有语言初始化的内联 CategoryTranslation 对象。例如,在我的站点支持俄语和英语中,应该显示 2 个(并且只有 2 个)内联,首先应该有不可编辑的字段语言等于 'ru',第二个 - 'en'。
- 分类保存后,新的 CategoryTranslation 应该得到 created_by 字段值等于当前用户,编辑 CategoryTranslation 应该得到edited_by 字段值等于当前用户。
这是我现在所做的:
如您所见,CategoryTranslationAdmin 的 max_num 字段为 0 以防止添加额外的翻译,表单集的 total_form_count 方法返回支持的语言和在表单创建时使用可用语言初始化的表单的计数。
更新 我还在 save_formset(self, request, form, formset, change) 方法中将当前用户设置为 formset,并使用他在 CategoryTranslationFormSet 类的 save() 方法中填充更改对象的字段。
这是对的吗?
所以现在我需要:
- 使 language_code 字段为只读(如果我只是将其添加到 readonly_fields 元组,我将无法在表单中对其进行初始化)。
- 了解,是我在保存正确之前添加用户的解决方案。
django - DJANGO:如何以形式呈现模型对象名称而不是文字“模型对象”?
我有以下模型:Department、Projects、Departmentprojects、Employees 和 Membership。一个部门有许多项目,项目有许多通过成员资格分配角色的员工。我正在尝试创建一个 InlineFormset,以便欧盟可以将员工的角色分配给多个项目。
我的模板呈现正确的标签和字段,但 Departmentprojects 标签和字段不显示项目的名称。它只显示“Departmentprojects 对象”。如何获取表单以呈现项目名称而不是“Departmentprojects 对象”?
--
浏览器中的当前模板:
部门项目标签:(下拉菜单有两个选项列为“部门项目对象”)角色:项目经理
浏览器中所需的模板:
部门项目名称1:项目经理
部门项目名称 2:其他角色
--
楷模:
--
看法
--
模板
django - DJANGO:如何限制 inlineformset 查询集
欧盟可以使用此表格来选择他们在任何给定项目中扮演的角色(项目经理、开发人员等)。我想将项目字段选项限制为仅限员工部门的选项。现在,欧盟可以选择任何部门的项目(但不能选择部门,我已经完全排除了)我该怎么做?queryset=blabla 不起作用..
楷模:
看法:
JSON:MANAGE.PY DUMPDATA TESTDB --INDENT=4
django - Django:使用“Unique Together”保存并通过 inlineformset 删除对象会导致错误页面
抱歉,如果这是一个简单的修复,我的内联表单集有 2 个问题:
保存无效对象(不满足唯一性要求)会引发错误页面,而不是在表单中显示错误。
有一次,我在保存无效对象时正确显示了错误,但是当我尝试保存有效对象时,我会收到一条错误消息,提示 members.department 为空。这就是为什么我把“例如在实例中”但是现在我遇到了保存无效对象时不显示错误的新问题。
删除有效对象时我遇到了同样的问题。该对象被删除,但我仍然得到一个错误页面......
我迷路了。
保存无效对象时,我得到:
删除有效对象时,我得到:
模型:
视图.py
django - 如何在 django 的自定义表单集的 clean 方法中将“DELETE”参数重置为 False
我在其中使用自定义清理方法制作了自定义表单集。它看起来像:
当我从表单集中删除一些表单(参数错误)并按下提交按钮(表单具有 DELETE 字段值 == True)时,我进入error = True
了我的干净方法,所以我得到了 ValidationError 并返回到表单窗口。但是表单中的 DELETE 字段值不会重置。下次我提交表单时,我会得到相同的 ValidationError。那么,我可以在我的自定义清理方法中以某种方式更改 DELETE 字段的值吗?
python - formset、inlineformset_Factory 和 kwargs
我有几个模型,我们称它们为模型 A 和模型 B。从 B 到 A 有一个外键。
也就是说 A 和 B 之间的基数是 1:n。
我为 B 制作了一个相应的 ModelForm,称为 MF_B。我在 B 中定义了一个附加字段。例如
正如上面的代码所暗示的,我想在这里用一个查询集填充选择。(我在init () 中省略了我们用来在 stuff 字段上设置查询集的覆盖代码)
交易是我想使用 inlineformset_factory 在一个页面上创建一个带有 A 的表单和几个带有 B 的表单。
我只想将一堆新的 kwargs 传递给 inlineformset_factory,但它一直抱怨意外的关键字参数,并且在查看 django 中的后端代码之后,我明白为什么:inlineformset_factory 不采用自定义 kwargs。它只需要方法 sig 中定义的 kwargs。
我不认为 ica 使用formfield_callback因为我需要传递 self.request.user 来过滤查询集中返回的对象。
有什么建议么?
python - 如何通过 AJAX 设置 Django 表单值
我正在尝试将 Django 生成的表单与 AJAX 调用一起用于数据填充。我只有一个普通的 ModelForm 工作,但是当我向它添加一个 inlineformset 时,我不知道应该在一些隐藏的 id 字段中填充什么值。每个提交都在创建一个新实例。对于有地址的学校,我的保存视图中有这个:
这是填充我的表单的 JS。#id_address_set-0-school
并且#id_address_set-0-id
是 2 个 Django 生成的字段。
有什么想法我应该放在那里吗?
django - Django Admin 像我的 ModelForm 中的内联
我正在尝试复制 Django 管理员中的内联,以便在我自己的非管理员 ModelForm 上的 FKd 模型上添加相关模型。特别是,当您使用 StackeAdminInline 并获得“+ 添加另一个 XXX”位 Javascript 以添加更多相关模型时。
如果管理员可以做到这一点,那一定是可能的,但我找不到一个带有如何做到这一点的例子的项目。有人可以指点我吗?我正在使用 Crispy Forms,但如果需要,我很高兴不使用。我确实看到了https://github.com/runekaagaard/django-crispy-forms-fancy-formsets但似乎 Crispy 维护者并不喜欢这管理员已经可以做到了。
谢谢!
django - 提高 forms.ValidationError 不起作用
我有以下型号:
在项目的创建表单中,我包含了一个用于里程碑的内联表单集。
我想验证提交项目时,至少创建了 4 个里程碑,并且所有里程碑的 budget_percentage 总和为 100
这是我的表格:
当我提交带有 3 个空里程碑表单的表单时,它对第一个表单没有任何作用。ValidationError(...)
我已经用 raise Exception() 验证了它实际上进入了 if,但它会继续,好像什么也没发生一样。
这是我的代码中的错误还是 ValidationError 的误解?
任何帮助将不胜感激,在此先感谢。
编辑:
我正在添加缺少的视图代码