Пользовательские объекты отображения полей 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)