Определенный набор запросов для ввода в Django ModelAdmin Изменить форму - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть объект 'Registration', который пользователи могут создавать на внешнем интерфейсе без проблем.

Это выглядит так:

class Registration(models.Model):
    person = models.ForeignKey(Person, on_delete=models.PROTECT)
    course_detail = models.ForeignKey(CourseDetail, on_delete=models.PROTECT)
    camp_shirt = models.ForeignKey(CampShirt, on_delete=models.PROTECT)
    comments = models.CharField(max_length=200, blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return "%s" % (self.course_detail.course.camp)

Когда я нахожусь вАдминистратор и нажмите на определенную регистрацию - загрузка займет некоторое время, потому что существуют тысячи и тысячи объектов Person.

Для простоты использования - никогда не будет времени, когда нам нужно будет отредактировать "персона"'связан с данной регистрацией, поэтому я хотел бы, чтобы при редактировании от администратора django в раскрывающемся списке' персона 'отображался только выбранный пользователь в наборе запросов персонажа.

Поэтому, когда я перехожу на http://myapp.com/admin/registration/23/change, я хочуформа для отображения только выбранного в данный момент человека в качестве единственного параметра в раскрывающемся списке.

Моя модель администратора выглядит следующим образом:

class RegistrationAdmin(admin.ModelAdmin):
    list_display = ("person", "course_detail")

    class Meta:
        # I think this is what I do in order to override the default admin form? Not sure.
        form = RegistrationAdminForm

Моя регистрацияAdminForm выглядит следующим образом:

class RegistrationAdminForm(forms.ModelForm):
    # course_detail, person, camp_shirt, comments
    person = forms.ModelChoiceField(queryset=Person.objects.filter(
        id=registration.person.id)
    )

    def __init__(self, registration, *args, **kwargs):
        super(RegistrationAdminForm, self).__init__(*args, **kwargs)
        self.fields['person'].queryset = Person.objects.filter(
            id=registration.person.id
        )

    class Meta:
        model = Registration
        fields = '__all__'

Основной вопрос : Как изменить форму администратора, чтобы возвращался определенный набор запросов для одного из полей в администраторе django?

1 Ответ

1 голос
/ 06 ноября 2019

Если поле персонажа никогда не изменится, вы можете добавить поле персоны к readonly_fields , выборка со всеми Person объектами не будет отображена.

class RegistrationAdmin(admin.ModelAdmin):
    list_display = ("person", "course_detail")
    readonly_fields = ("person", )

Тогда выне нужна ваша пользовательская форма. К вашему сведению, если вы хотите добавить пользовательскую форму в ModelAdmin, вы не помещаете ее в Meta, вы определяете ее в самой форме

class MyModelAdmin(admin.ModelAdmin):
    form = MyModelForm
...