管理内联ManyToMany autocomplete_fields

use*_*885 4 python django admin

我想AcademicGroupInline使用其vk_chat关系添加对 with 的搜索

# 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]
Run Code Online (Sandbox Code Playgroud)

但我的结果有错误:

<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'.
Run Code Online (Sandbox Code Playgroud)

小智 8

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

@admin.register(AcademicGroup )
class AcademicGroupAdmin(admin.ModelAdmin):
      ....
      search_fields = ['vk_chat']
Run Code Online (Sandbox Code Playgroud)

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

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

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

class AcademicGroupInline(admin.TabularInline):
    model = Student.academicgroups.through
    autocomplete_fields = (
        'academicgroup',
    )
Run Code Online (Sandbox Code Playgroud)