Django Admin: Показать только некоторые объекты в поле ManyToMany? - PullRequest
0 голосов
/ 01 июля 2019

У меня относительно простая модель данных с User, Group и Task. Каждая группа имеет свои задачи и пользователей. Пользователи могут быть назначены только в одну группу.

Задачи принадлежат группам, и каждая задача имеет поле manyToMany для пользователей, поэтому нескольким пользователям может быть назначено одно и то же задание.

В моем администраторе при назначении пользователей для задачи отображаются все созданные пользователи, я хочу, чтобы показывал только пользователей из той же группы, что и задача.

Какой будет лучший подход?

Я проверил доступные параметры настройки для admin.ModelAdmin, но не нашел ничего связанного с моей проблемой.

Ответы [ 2 ]

1 голос
/ 01 июля 2019

Вы можете настроить администратора модели, используя метод: formfield_for_manytomany

class TaskAdmin(admin.ModelAdmin):

    def formfield_for_manytomany(self, db_field, request, **kwargs):
        if db_field.name == "users":
            # Filter your users below as per your condition
            kwargs["queryset"] = Users.objects.filter()
        return super(TaskAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)
1 голос
/ 01 июля 2019

вы можете использовать formfield_for_manytomany

метод formfield_for_manytomany может быть переопределен для изменения поля формы по умолчанию для поля "многие ко многим"

в вашем случае измените admin.py на:

class TaskAdmin(admin.ModelAdmin):

    def get_object(self, request, object_id, s):
        # Hook obj for use in formfield_for_manytomany
        self.obj = super(TaskAdmin, self).get_object(request, object_id)
        # print ("Got object:", self.obj)
        return self.obj


    def formfield_for_manytomany(self, db_field, request, **kwargs):
        if db_field.name == "user":
            kwargs["queryset"] = User.objects.filter(task=self.obj)
        return super().formfield_for_manytomany(db_field, request, **kwargs)

admin.site.register(Task, TaskAdmin)
...