Можно ли отфильтровать выбор по внешнему ключу в панели администратора Django? - PullRequest
3 голосов
/ 24 мая 2011

Вот моя ситуация:
У меня есть три модели: класс, курс и программа. У оценки есть внешний ключ к курсу, а у курса - внешний ключ к программе.

Вот моя проблема:
Когда мне нужно добавить несколько оценок в моей админ-панели, у меня появляется список, полный курса. Первая проблема: одно и то же название курса можно найти в двух разных программах, и его трудно определить в списке. На данный момент это отображается как Program.name - Course.name

Мне было интересно, есть ли какое-нибудь решение, которое может помочь мне отфильтровать мой список курсов по программам, когда я хочу создать или изменить оценку. (Я имею в виду интерфейс создания оценок, а не список до этого интерфейса).

EDIT:
Спасибо за ваши ответы. Я думаю, мне придется кодировать свой собственный виджет, сделать мой фильтр на стороне клиента с AJAX.

Ответы [ 2 ]

0 голосов
/ 24 мая 2011

Вы можете написать такой фильтр с помощью AJAX (использование jQuery или подобного фреймворка было бы самым простым способом сделать это).Вы бы создали собственный виджет формы с двумя списками.Первый будет заполнен всеми доступными программами сервером при загрузке страницы.Затем ваш javascript будет ожидать выбора, а затем запросит у сервера (то есть AJAX-часть) список курсов в этой программе и обновит второй список соответствующим образом.

Однако для вашегоЯ бы сказал, что ситуация излишняя;это было бы гораздо проще сделать, поскольку в ответе jammon сказано: и поместить администратора модели Grade в соответствующий администратор курса (это называется встроенным администратором модели; см. документацию по Django ).на предмет).К сожалению, приведенный в их ответе пример кода не работает, поэтому я создал следующий пример, который работает для меня.

Основной способ настройки администратора Django - просто зарегистрировать свои модели на сайте администратора.в admin.py.Вы, вероятно, делаете что-то вроде следующего:

from django.contrib import admin
from myapp.models import Program, Course, Grade

admin.site.register(Program)
admin.site.register(Course)
admin.site.register(Grade)

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

class GradeInline(admin.TabularInline):
    model = Grade
    extra = 1

Обратите внимание, что вы можете наследовать либо admin.TabularInline, либо admin.StackedInline.Обычно я предпочитаю внешний вид TabularInline, но это может зависеть от вашей модели, поэтому попробуйте оба варианта.Опция extra определяет, сколько пустых форм будет показано пользователю.

Далее нам нужно указать странице администратора курса добавить встроенные формы:

class CourseAdmin(admin.ModelAdmin):
    model = Course
    inlines = (GradeInline,)

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

from django.contrib import admin
from myapp.models import Program, Course, Grade

class GradeInline(admin.TabularInline):
    model = Grade
    extra = 1

class CourseAdmin(admin.ModelAdmin):
    model = Course
    inlines = (GradeInline,)

admin.site.register(Program)
admin.site.register(Course, CourseAdmin)
0 голосов
/ 24 мая 2011

У меня была похожая проблема, вот решение, к которому я пришел:

Определите InlineModelAdmin для оценки в ModelAdmin, конечно.

class CourseAdmin(admin.ModelAdmin):
    class GradeInline(admin.StackedInline):
        model = Grade
        fk_name = 'course'
        extra = 2
        and so on

Затем вы можете добавлять и редактировать оценки в change_view курса, к которому они принадлежат, и вам совсем не нужно выбирать курс.

И для того, чтобы рассказывать о курсах различных программ отдельно в списках, я бы переопределил course.__unicode__, чтобы он возвращал что-то вроде «grade.name (program.name)».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...