Выберите из ENUM в Django - PullRequest
       47

Выберите из ENUM в Django

1 голос
/ 13 февраля 2020

Ниже приведена моя модель,

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

Класс Enum равен

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')

Требование: я хочу, чтобы только игроки мужского пола находились на странице «Мой админ» в поле имя_пользователя.

Как отфильтровать из класса ENUM, чтобы в поле администратора Django были указаны только имена игроков мужского пола. , Пожалуйста, помогите мне. Спасибо!

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Я сделал это путем переопределения formfield_for_foreignkey метода в admin. И если у вас есть больше полей, к которым необходимо применить фильтр, просто добавьте больше блоков if и отфильтруйте связанные модели (импортируя модели).

А если есть отношение ForeignKey, вам нужно go от дочернего к родительскому классу, используя __ между полями дочернего к родительскому

@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)
0 голосов
/ 13 февраля 2020

Используя ссылку 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,)

Надеюсь, это поможет.

...