【问题标题】:Select from ENUM in Django从 Django 中的 ENUM 中选择
【发布时间】:2020-02-13 05:51:07
【问题描述】:

下面是我的模型,

class Employee(models.Model):
    name = models.CharField(max_length=100)
    sex = models.PositiveIntegerField(choices=choices(Type))

枚举类是

class Type(Enum):
    Male = 0
    Female = 1

现在来到我们的主要模型

class Tournament(models.Model):
    player_name = models.ForeignKey(Employee)

我的管理员是

@admin.register(Tournament, site=admin.site)
class TournamentAdmin(admin.ModelAdmin):
    list_display = ('player_name')

要求是我只想在我的管理页面中的字段 player_name 中获取男性玩家。

如何从 ENUM 类中过滤以在 Django 管理字段中仅获取男性玩家姓名。 请帮我。谢谢!

【问题讨论】:

  • choices() 从哪里导入?
  • 嘿 Arakkal,Choices 来自 ENUM 类。我已经进口了,一切都很好。只需要过滤一个值或对其进行硬编码以仅获取男性。
  • 您需要为您的用例创建一个自定义过滤器。请参考:docs.djangoproject.com/en/dev/ref/contrib/admin/…
  • @Learner 我是出于好奇才问的。可以添加choice()函数的引用吗?

标签: python django django-models enums django-admin


【解决方案1】:

我已经通过在管理员中覆盖 formfield_for_foreignkey 方法来做到这一点。如果您有更多需要应用过滤器的字段,只需添加更多 if 块并从相关模型中过滤(通过导入模型)。

如果存在 ForeignKey 关系,则需要在子类到父类的字段之间使用 __ 从子类到父类

@admin.register(Tournament, site=admin.site)
class TournamentAdmin(admin.ModelAdmin):
    list_display = ('player_name')

    def formfield_for_foreignkey(self,db_field,request,**kwargs):
        if db_field.name == 'player_name':
            kwargs['queryset'] = Employee.objects.filter(type=Type.Male.value)
        return super().formfield_for_foreignkey(db_field,request,**kwargs)

【讨论】:

    【解决方案2】:

    使用参考 Django admin.SimpleListFilter 。你可以试试这个:

    from django.contrib import admin
    
    class GenderListFilter(admin.SimpleListFilter):
        # Human-readable title which will be displayed in the
        # right admin sidebar just above the filter options.
        title = _('gender')
    
        # Parameter for the filter that will be used in the URL query.
        parameter_name = 'gender'
    
        def lookups(self, request, model_admin):
            """
            Returns a list of tuples. The first element in each
            tuple is the coded value for the option that will
            appear in the URL query. The second element is the
            human-readable name for the option that will appear
            in the right sidebar.
            """
           return (
            (0, _('Male')),
            (1, _('Female')),
            )
    
    def queryset(self, request, queryset):
        """
        Returns the filtered queryset based on the value
        provided in the query string and retrievable via
        `self.value()`.
        """
        return queryset.filter(player_name__sex==self.value())
    
    class TournamentAdmin(admin.ModelAdmin):
        list_filter = (GenderListFilter,)
    

    希望对你有帮助。

    【讨论】:

    • 嘿,在方法查找中,我们只需要返回 (0, _('Male')) 对。什么是 title 和 parameter_name 这里是性别?只是想知道它们将如何显示
    • @Learner 标题将显示在管理页面的右侧。您可以参考提供的链接了解详细信息。
    • 是的,我看到了。但我的要求是一旦我点击 TournamentAdmin。 player_name 列将显示。现在在我的例子中,一旦我们点击该列,它就会显示所有的男人和女人。我只需要在专栏中显示男性。这个 list_display 会在那里工作吗?
    • 我们不需要在侧边栏或其他任何地方显示任何内容。我们只需要在 admin 中的 player_name 列中获取与男性相关的值。所以它与管理页面本身无关。它只与列值有关
    • 为此,您可以在模型管理类中覆盖 get_queryset 方法。
    猜你喜欢
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 2018-10-21
    • 2021-11-25
    • 2017-01-05
    • 1970-01-01
    相关资源
    最近更新 更多