正在验证Django admin中的ManyToManyField项(具有中间模型)的数量

2024-10-02 02:39:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些Django模型,看起来像这样(这不是我的确切代码,而是一个结构相同的简单示例):

class Player(models.Model):
    # Some fields here.
    pass

class Team(models.Model):
    players = models.ManyToManyField(Player, through='TeamPlayer')

class TeamPlayer(models.Model):
    team = models.ForeignKey(Team)
    player = models.ForeignKey(Player)
    some_other_field = models.BooleanField()

我使用through机制,因为我的链接表上有额外的列。在

我的管理类如下所示(请注意,我使用内联管理来添加播放器):

^{pr2}$

问题:我的问题是,在我的管理中,我想确认一个团队有11名球员。任何少的都会导致错误。我该怎么做?在

以下是我尝试过的方法以及它们失败的原因:

  1. 验证Team模型的clean方法中的玩家数量。这不起作用,因为玩家还没有被保存,所以对于一个新的物体,玩家总是为零。

  2. 验证TeamAdmin使用的clean_players方法中的数字。此方法永远不会被调用。其他非manytomy字段的类似方法也会被调用。

  3. 验证上述ModelFormclean方法中的数字。调用此方法,但self.cleaned_data字典没有'players'的条目。

有什么想法我可以实现这种类型的验证吗?我还远没有成为一个Django专家,所以不要以为我做了所有应该显而易见的事情。在


Tags: django方法模型cleanmodelmodels玩家数字
1条回答
网友
1楼 · 发布于 2024-10-02 02:39:04

您需要在teamplayerline上设置formset。并重写该表单集中的clean方法。例如:

from django.forms.models import BaseInlineFormSet

class TeamPlayerFormset(BaseInlineFormSet):
    def clean(self):
        """Check that exactly 11 players are entered."""
        super(TeamPlayerFormset, self).clean()

        if any(self.errors):
            return

        count = 0
        for cleaned_data in self.cleaned_data:
            if cleaned_data and not cleaned_data.get('DELETE', False):
                count += 1
        if count != 11:
            raise forms.ValidationError('You must enter 11 team players.')


class TeamPlayerInline(admin.TabularInline):
    model = TeamPlayer
    max_num = 11
    extra = 11
    formset = TeamPlayerFormset


class TeamAdmin(admin.ModelAdmin):
    inlines = [TeamPlayerInline]

相关问题 更多 >

    热门问题