在Django ModelAdmin更改表单上输入的特定查询集

我有一个“注册”对象,用户可以在前端创建它,而不会出现问题。

它看起来像这样:

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

主要问题:如何更改admin表单,以便为django admin中的一个字段返回特定的查询集?

zjqgd 回答:在Django ModelAdmin更改表单上输入的特定查询集

如果人员字段永远不会更改,则可以将人员字段添加到readonly_fields,将不会呈现具有所有Person对象的选择。

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

然后,您不需要自定义表单。仅供参考,当您要将自定义表单添加到ModelAdmin时,无需将其放在Meta中,而是在表单本身上定义

class MyModelAdmin(admin.ModelAdmin):
    form = MyModelForm
本文链接:https://www.f2er.com/3156372.html

大家都在问