gpt4 book ai didi

python - django忽略表单集中更改的字段

转载 作者:太空宇宙 更新时间:2023-11-03 18:46:07 25 4
gpt4 key购买 nike

我有以下型号:

class Recipe(models.Model):
fields...

class Ingredient(models.Model):
fields...

class UsesIngredient(models.Model):
recipe = models.ForeignKey(Recipe)
ingredient = models.ForeignKey(Ingredient)
amount = models.FloatField()
group = models.CharField()

我有一个 View ,允许用户通过动态表单集为特定配方添加任意数量的“UsesIngredient”模型。组属性会自动填充,对用户隐藏。

问题是,当用户在表单集中添加新表单但未填写任何字段时,我不希望保存该表单。但是,django 仍然尝试保存表单,因为“group”属性已“更改”(因为在创建额外表单时已自动填写)。

有什么办法可以解决这个问题吗?

谢谢!

最佳答案

嗯,我对 Tim Edgar 的解决方案仍然不太满意,所以我继续寻找。我想我找到了我要找的东西。“Form”类有两个未记录的方法可在本例中使用:“has_changed()”和“_get_changed_data”。

在 ModelFormSet 验证期间,每个表单都会检查“has_changed()”。如果表单未更改,则跳过验证并假定表单正确。同样,在 ModelFormSet 保存期间,save_new_objects 检查每个表单以查看其是否已更改。如果没有更改,则不会保存表单。

所以我的解决方案是重写 has_changed() 方法,以便在仅“group”属性发生更改且所有其他字段均为空的情况下返回 False。这是我的实现:

class UsesIngredientForm(forms.ModelForm):    
class Meta:
model = UsesIngredient

def has_changed(self, *args, **kwargs):
self._get_changed_data(*args, **kwargs)
# If group is in changed_data, but no other fields are filled in, remove group so
# the form will not be validated or saved
if 'group' in self._changed_data and len(self._changed_data) == 1:
contains_data = False
for name in ['ingredient', 'amount', 'unit']:
field = self.fields[name]
prefixed_name = self.add_prefix(name)
data_value = field.widget.value_from_datadict(self.data, self.files, prefixed_name)
if data_value:
contains_data = True
break
if not contains_data:
self._changed_data.remove('group')
return bool(self._changed_data)

希望这对将来的任何人都有帮助!

编辑:我编辑了这个答案以反射(reflect)蒂姆·埃德加的评论。我意识到这个实现仍然使用“私有(private)”方法,但我还没有找到仅使用公开记录的方法的更干净的实现。但也许这只是我自己的无能:)。

关于python - django忽略表单集中更改的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19480667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com