0

我有一个“注册”对象,用户可以在前端毫无问题地创建它。

它看起来像这样:

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

我的 RegistrationAdminForm 看起来像这样:

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__'

Main Question : How do I change the admin form so that a specific queryset is returned for one of the fields in the django admin?

4

1 回答 1

1

If the person field will never be changed you can add the person field to readonly_fields, a select with all Person objects will not be rendered.

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

Then you do not need your custom form. FYI when you want to add a custom form to a ModelAdmin you do not put it in Meta, you define it on the form itself

class MyModelAdmin(admin.ModelAdmin):
    form = MyModelForm
于 2019-11-06T05:08:14.833 回答