首页 > 解决方案 > 管理内联多对多 autocomplete_fields

问题描述

AcademicGroupInline我想使用它的vk_chat关系添加搜索

# models.py

class AcademicGroup(models.Model):
    students = models.ManyToManyField(
        'user.Student',
    )
    vk_chat = models.OneToOneField(
        'Chat',
    )


class Chat(models.Model):
    owner_id = models.BigIntegerField()
    name = models.CharField()


# admin.py

class AcademicGroupInline(admin.TabularInline):
    model = AcademicGroup.students.through
    autocomplete_fields = (
        'vk_chat',
    )


@admin.register(Student)
class StudentAdmin(admin.ModelAdmin):
    inlines = [AcademicGroupInline]

但是我的结果有一个错误:

<class 'user.admin.AcademicGroupInline'>: (admin.E037) The value of 'autocomplete_fields[0]' refers to 'vk_chat', which is not an attribute of 'course.AcademicGroup_students'.

标签: pythondjangoadmin

解决方案


首先,您应该注册 AcademicGroup 模型,就像您对 Student 所做的那样,并添加search_fields应该具有vk_chat值的属性。

@admin.register(AcademicGroup )
class AcademicGroupAdmin(admin.ModelAdmin):
      ....
      search_fields = ['vk_chat']

其次,在您的 AcademicGroup 模型中,您应该在您的 M2M 字段中添加此参数related_name='academicgroups'(您可以随意命名)。

第三,在您的 AcademicGroupInline 课程中,您应该Student.AcademicGroup.through输入模型字段,而不是AcademicGroup.students.through因为我想您想列出与学生关联的 Acadamicgroups 而不是相反的。

最后,在你的中autocomplete_fields你只能放置由创建的模型的属性AcademicGroup.students.through,所以我建议你print(model._meta.fields)在你的AcademicGroupInline类中使用打印这些属性(我想你会得到idstudentacademicgroup)。所以,你autocomplete_fields应该有academicgroup一个价值。

class AcademicGroupInline(admin.TabularInline):
    model = Student.academicgroups.through
    autocomplete_fields = (
        'academicgroup',
    )

推荐阅读