Django 管理界面:了解带有提交参数的表单保存行为

问题描述 投票:0回答:1

我目前正在使用 Django 的管理界面,遇到一些与使用 commit 参数保存表单相关的意外行为。这就是我想要理解的:

上下文:我正在使用自定义表单(DeckCreateForm),并重写保存方法来处理保存牌组数据。在此方法中,我将 commit 参数设置为 False 以防止立即数据库提交。

观察:尽管将 commit 设置为 False,但通过管理界面保存表单实例时,表单数据似乎正在提交到数据库。

需要理解:我正在寻求澄清为什么即使 commit 显式设置为 False,表单数据也会提交到数据库。此外,我想了解可能影响 Django 管理界面上下文中提交参数行为的因素。

所做的努力:我已经查看了有关表单保存和管理界面的 Django 文档,但尚未找到对此行为的明确解释。我还检查了我的代码,没有发现任何明显的错误或配置错误。

请求:我正在从 Django 社区寻找有关 Django 管理界面如何处理表单保存以及可能影响提交参数行为的因素的见解或解释。此外,任何有关故障排除或进一步探索的建议将不胜感激。

我的代码:

自定义保存函数(forms.py):

def save(self, commit=False):
    deck = super().save(commit=False)

    if commit:
        deck.save()
        self.save_m2m()

        cleaned_data = self.cleaned_data
        word_items = cleaned_data.get('word_items')

        with transaction.atomic():
            try:
                for rank, word_item in enumerate(word_items, start=1):
                    deck_entry, created = DeckWord.objects.get_or_create(
                        deck=deck,
                        word_item=word_item,
                        defaults={'rank':1}
                    )
            except IntegrityError as e:
                raise
    return deck

管理员.py

@admin.register(Deck)
class DeckAdmin(admin.ModelAdmin):
    list_display = ['id', 'name', 'description', 'language', 'is_ranked', 'created_by', 'visibility']
    form = DeckCreateForm

对此事的任何指导或见解对于帮助我更好地理解 Django 的管理界面行为都是非常宝贵的。预先感谢您的协助!

python django django-forms django-admin
1个回答
0
投票

您正在重写 save 方法,并且在您的重写逻辑中,您使用的方法将在数据库中执行保存操作 ----

get_or_create
方法。

commit=False
选项适用于您使用模型表单等的情况。因为您正在覆盖保存并调用将在数据库中执行保存的方法,所以发送
commit=False
没有任何效果。

以下摘自 django 官方文档

此 save() 方法接受一个可选的 commit 关键字参数,该参数接受 True 或 False。如果您使用 commit=False 调用 save(),那么它将返回一个尚未保存到数据库的对象。在这种情况下,您可以对生成的模型实例调用 save()。如果您想在保存对象之前对其进行自定义处理,或者如果您想使用专门的模型保存选项之一,这非常有用。默认情况下 commit 为 True。

© www.soinside.com 2019 - 2024. All rights reserved.