Пользовательские объекты отображения полей Manytomany в Django

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

Я использовал стандартную систему User в Django и добавил сюда поле, которое показывает, является этот пользователь фотографом или нет :

from django.contrib.auth.models import AbstractUser

# Create your models here.
class User(AbstractUser):
    is_photographer = models.BooleanField(default=True)

Также, в модели, в которую мне нужно поместить изображения, я использовал поле ManyToMany для фотографов (потому что эти фотографии могли быть сделаны несколькими людьми) :

from registration import User

class Photo(models.Model):
    ...
    photographers = models.ManyToManyField(User)

Проблема в том, что при добавлении нового изображения в админ панели, пользователи, которые не являются фотографами и is_photographer имеет значение False, также отображаются в Фотографах. Я хочу, чтобы отображались только пользователи, которые являются фотографами, а не обычные пользователи.

В вашем файле admin.py сделайте следующее:

class PhotoAdmin(admin.ModelAdmin):
    def formfield_for_manytomany(self, db_field, request, **kwargs):
        kwargs['queryset'] = Users.objects.filter(is_photographer=True)
        return super().formfield_for_manytomany(db_field, request, **kwargs)

admin.site.register(Photo, PhotoAdmin)

Вы можете работать с limit_choices_to=… [Django-doc]:

from django.conf import settings

class Photo(models.Model):
    # …
    photographers = models.ManyToManyField(
        setting.AUTH_USER_MODEL,
        limit_choices_to={'is_photographer': True}
    )

Примечание: Обычно лучше использовать settings.AUTH_USER_MODEL [Django-doc] для ссылки на модель пользователя, чем использовать User модель [Django-doc] напрямую. Для получения дополнительной информации вы можете посмотреть ссылка на User модель раздел документации .

Вы можете использовать Django formfield. Django разместил эти поля форм для различных типов полей. Чтобы использовать поля форм в отношениях ManyToMany, вы можете использовать formfield_for_manytomany в модели admin_class.

Попробуйте поместить эту функцию в класс администратора фотомодели в файле admin.py приложения, в котором находится фотомодель, а если у вас нет класса администратора, создайте его следующим образом:

from .models import Photo
from django.contrib import admin
from registration.models import User


class PhotoAdmin(admin.ModelAdmin):
    def formfield_for_manytomany(self, db_field, request, **kwargs):
        kwargs["queryset"] = User.objects.filter(is_photographer=True)
        return super(PhotoAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)

admin.site.register(Photo, PhotoAdmin)
Вернуться на верх