【问题标题】:Django-admin validation on Foreign object外部对象上的 Django-admin 验证
【发布时间】:2015-04-02 05:12:33
【问题描述】:

我有一个 Team 模型和 Staff 模型(对于 Team 来说是外来的)。每个 Team Object 可以关联 1 - 10 个 Staff 对象。

每个人员对象都有一个布尔字段来指示他/她是否是团队协调员。

我如何在django管理页面中确保管理员用户在输入团队信息以及相关的员工信息(内联)时,他/她必须选择至少一个团队协调员(团队内的所有员工都可以是协调员吗?但不能为零)。

感谢您的建议。

models.py

class Team(models.Model):
team_id = models.AutoField(primary_key=True, verbose_name='Team ID')
team_name = models.CharField(max_length=100, verbose_name='Team Name')
def __str__(self):
    return self.team_name
class Meta:
    verbose_name='Team'

class Staff(models.Model):
    staff_id = models.AutoField(primary_key=True)
    team_id = models.ForeignKey(Team)
    staff_name = models.CharField(max_length=100, verbose_name='Staff Name')
    is_team_coord = models.BooleanField(verbose_name='Is Team Coordinator', default=False)
    def __str__(self):
        return self.staff_name
    class Meta:
        verbose_name='Staff'

admin.py

class StaffInLine(admin.TabularInline):
model = Staff
def get_max_num(self, request, obj=None, **kwargs):
    return 10
def get_min_num(self, request, obj=None, **kwargs):
    return 1

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

【问题讨论】:

    标签: python django python-2.7 django-admin


    【解决方案1】:

    我自己通过参考这个链接找到了答案 Inline Form Validation in Django

    完整的解决方案是:

    forms.py

    class StaffInLineFormSet(forms.models.BaseInlineFormSet):
        def clean(self):
            count = 0
            for form in self.forms:
                try:
                    if form.cleaned_data.get('is_team_coord') is True:
                        count += 1
                except AttributeError:
                    pass
            if count == 0:
                raise forms.ValidationError('You must choose at least one Team Coordinator')
    

    admin.py

    class StaffInLine(admin.TabularInline):
        model = Staff
        formset = StaffInlineFormSet
        def get_max_num(self, request, obj=None, **kwargs):
            return 10
        def get_min_num(self, request, obj=None, **kwargs):
            return 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      • 2013-01-20
      • 2017-05-18
      • 2016-08-22
      • 2015-05-04
      • 2014-09-08
      • 2011-05-17
      相关资源
      最近更新 更多