gpt4 book ai didi

django-models - Django Admin - 具有外键字段的模型的自定义清理方法

转载 作者:行者123 更新时间:2023-12-03 02:44:10 29 4
gpt4 key购买 nike

考虑以下模型:

class Arena(models.Model):
crowd_capacity = models.PositiveInteger()
# more fields here

class Section(models.Model):
name = models.CharField(max_length=10)
crowd_capacity = models.PositiveInteger()
arena = models.ForeignKey(Arena, related_name='sections')

admin.py:

class SectionInline(admin.StackedInline):
model = Section
fk_name = 'arena'
extra = 1

class ArenaAdmin(admin.ModelAdmin):
inlines = [
SectionInline,
]

我想添加一个验证方法来检查所有section.crowd_capacity的总和不超过arena.crowd_capacity的总和。

起初我想用 clean 方法编写一个自定义的SectionFormSet,但后来我没有看到如何获取 arena.crowd_capacity。

我还尝试向 Arena 添加 clean 方法,它确实显示了一个很好的红色验证错误,但无法解决问题。看起来 Arena clean 方法在保存所有部分后运行,并且更改section.crowd_capacity和w.e部分没有效果。

我尝试过的验证方法:

def clean(self):
super(Arena, self).clean()
capacity = 0
for s in self.sections.all():
capacity += s.crowd_capacity

if capacity > self.crowd_capacity:
raise ValidationError('The sum of all sections crowd capacity '
'exceeds arena crowd capacity')

最佳答案

好吧,我终于找到办法了。

为了澄清,我想验证所有部分的人群容量总和不超过竞技场人群容量的总和。

最终解决方案是(在admin.py中):

class SectionFormSet(forms.models.BaseInlineFormSet):
def clean(self):
if any(self.errors):
return
capacity = 0
for f in self.forms:
try:
capacity += f.cleaned_data['crowd_capacity']
if capacity > f.cleaned_data['arena'].crowd_capacity:
raise ValidationError('The sum of all sections crowd capacity '
'exceeds arena crowd capacity')
except KeyError:
# in case of empty form
pass


class SectionInline(admin.StackedInline):
model = Section
formset = SectionFormSet

class ArenaAdmin(admin.ModelAdmin):
inlines = [
SectionInline,
]

就是这样,模型没有改变。效果就像一个魅力:)

关于django-models - Django Admin - 具有外键字段的模型的自定义清理方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13570778/

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