Для модели с полями ForeignKeyField (FKF) или ManyToManyField (MTMF) с внешним ключом «self», как я могу предотвратить self (рекурсивный) выбор в Django Admin (admin).
Короче говоря, должна быть возможность предотвратить сам (рекурсивный) выбор экземпляра модели в админке. Это применяется при редактировании существующих экземпляров модели, а не при создании новых экземпляров.
Например, возьмите следующую модель для статьи в новостном приложении;
class Article(models.Model):
title = models.CharField(max_length=100)
slug = models.SlugField()
related_articles = models.ManyToManyField('self')
Если имеется 3 Article
экземпляра (название: a1-3), при редактировании существующего Article
экземпляра через администратора поле related_articles
по умолчанию представляется в виде html (множественного) поля выбора, которое обеспечивает список ВСЕХ статей (Article.objects.all()
). Пользователь должен видеть и иметь возможность выбирать Article
экземпляров, отличных от самого себя, например, При редактировании Article
a1, related_articles
доступно для выбора = a2, a3.
В настоящее время я вижу 3 возможных способа сделать это в порядке уменьшения предпочтения;
- Предоставляет способ задания набора запросов, предоставляя доступные варианты в поле формы администратора для
related_articles
(через фильтр исключающих запросов, например, Article.objects.filter(~Q(id__iexact=self.id))
, чтобы исключить текущий редактируемый экземпляр из списка related_articles, который может видеть пользователь и выберите из. Создание / настройка используемого набора запросов может происходить в конструкторе (__init__
) пользовательского Article ModelForm
или с помощью некоторого динамического параметра limit_choices_to Model
. Для этого потребуется способ получить экземпляр редактируется для использования для фильтрации.
- Переопределите функцию
save_model
класса Article Model
или ModelAdmin
, чтобы проверить и удалить себя из related_articles
перед сохранением экземпляра. Это по-прежнему означает, что пользователи с правами администратора могут видеть и выбирать все статьи, включая редактируемый экземпляр (для существующих статей).
- Отфильтровывать собственные ссылки, когда это необходимо для использования вне администратора, например, шаблоны.
Идеальное решение (1) в настоящее время возможно сделать через пользовательские формы модели вне администратора, поскольку можно передать отфильтрованную переменную набора запросов для экземпляра, редактируемого в конструкторе формы модели. Вопрос в том, можете ли вы получить экземпляр Article
, то есть «self», отредактированный администратором перед созданием формы, чтобы сделать то же самое.
Может быть, я поступаю неправильно, но если вам разрешено определять FKF / MTMF для той же модели, тогда должен быть способ заставить администратора - делать правильные вещи - и запретить пользователю выбирать себя, исключив его из списка доступных вариантов.
Примечание: Решение 2 и 3 можно сделать сейчас, и мы стараемся избегать их получения в качестве ответов, в идеале я хотел бы получить ответ на решение 1.