После нескольких часов чтения вопросов, связанных с полу, я, наконец, понял это.
Вы не можете самостоятельно ссылаться на модель так, как я пытался это сделать, нет способа заставить django действовать так, как я хотел использовать limit_choices_to, потому что он не может найти идентификатор другого ForeignKey в той же модели ,
Это может быть сделано, если вы измените способ работы django, но более простой способ решить это - это внести изменения в admin.py.
Вот что это выглядит как в моем models.py:
# models.py
class MovieCategory(models.Model):
category = models.ForeignKey(Category)
movie = models.ForeignKey(Movie)
prefix = models.ForeignKey('Prefix', blank=True, null=True)
number = models.DecimalField(verbose_name='Movie Number', max_digits=2,
blank=True, null=True, decimal_places=0)
Я просто удалены limit_choices_to полностью. Я нашел похожую проблему here с решением отправил Kyle Duncan. Разница заключается в том, что это использует ManyToMany, а не ForeignKey. Это означает, что мне пришлось удалить filter_horizontal = ('prefix',)
под мой класс MovieCategoryAdmin(admin.ModelAdmin):
, поскольку это только для полей ManyToMany.
В admin.py Для создания формы вам нужно добавить from django import forms
. Это как форма выглядит:
class MovieCategoryForm(forms.ModelForm):
class Meta:
model = MovieCategory
fields = ['prefix']
def __init__(self, *args, **kwargs):
super(MovieCategoryForm, self).__init__(*args, **kwargs)
self.fields['prefix'].queryset = Prefix.objects.filter(
category_id=self.instance.category.id)
И мой AdminModel:
class MovieCategoryAdmin(admin.ModelAdmin):
"""
Admin Class for 'Movie Category'.
"""
fieldsets = [
('Category', {'fields': ['category']}),
('Movie', {'fields': ['movie']}),
('Prefix', {'fields': ['prefix']}),
('Number', {'fields': ['number']}),
]
list_display = ('category', 'movie', 'prefix', 'number')
search_fields = ['category__category_name', 'movie__title', 'prefix__prefix']
form = MovieCategoryForm
Это точно, как Кайл описывает это в своем ответе, за исключением того, я должен был добавить fields = ['prefix']
к форме или Wouldn» t запустить. Если вы выполните его шаги и не забудьте удалить filter_horizontal и добавить поля, которые вы используете, они должны работать.
Редактировать: Это решение отлично работает при редактировании, но не при создании новой записи, поскольку не может найти идентификатор категории, если он не выходит. Я пытаюсь выяснить, как это решить.
Если вы довольны только поднятием ошибки проверки, см. Http://stackoverflow.com/q/37946885/247696 – Flimm