如何使用查询集在 Django 中自定义 list_display 选项?

How to customize the list_display option in django using queryset?

我想为我的大学制作一个课程指导应用程序。这是我的 model.py

from django.db import models
from django.contrib.auth.models import User

# Create your models here.

class Instructor(models.Model):
    name = models.CharField(max_length=200)
    owner = models.ForeignKey(User)
    # other stuff here 
    def __str__(self):
        return self.name

class Course(models.Model):
    course_code = models.CharField(max_length=10, default='CS')
    instructor = models.ForeignKey(Instructor)
    course_name = models.CharField(max_length=200)
    # other stuff here 
    def __str__(self):
        return self.course_name

class CourseOutline(models.Model):
    course = models.OneToOneField(Course)
    objectives = models.TextField(blank=True)
    # other stuff

这是我的 admin.py

from django.contrib import admin
from models import Course, CourseOutline, Instructor

# Register your models here.
admin.site.register(Instructor)
class CourseAdmin(admin.ModelAdmin):

    # some other stuff 
    def queryset(self, request):
        qs = super(CourseAdmin, self).queryset(request)
        if request.user.is_superuser:
            return qs


        # get instructor's "owner" 
        return qs.filter(instructor__owner=request.user)

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "instructor" and not request.user.is_superuser:
            kwargs["queryset"] = Instructor.objects.filter(owner=request.user)
            return db_field.formfield(**kwargs)
        return super(CourseAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

    list_display = ('course_name', 'instructor')
    list_filter = ('queryset',)

admin.site.register(Course, CourseAdmin)

class CourseOutlineAdmin(admin.ModelAdmin):
    # nothing here of importance

    # whatever was here

    def queryset(self, request):
        qs = super(CourseOutlineAdmin, self).queryset(request)
        if request.user.is_superuser:
            return qs
        # get instructor's "owner"
        return qs.filter(course__instructor__owner=request.user)

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "course" and not request.user.is_superuser:
            kwargs["queryset"] = Course.objects.filter(instructor__owner=request.user)
            return db_field.formfield(**kwargs)
        return super(CourseAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

admin.site.register(CourseOutline, CourseOutlineAdmin)

在这里,我对讲师使用行级权限,这样他们只能添加与他们相关的课程,并且只能向与他们相关的课程添加课程大纲。这就是为什么我使用 instructor 作为课程的外键并编写了一个函数来操作外键下拉菜单,以便只有他们的名字会出现在下拉菜单中。但是当他们看到课程时,他们可以观看其他教师的课程,如果他们有删除课程的权限,那么他们也可以删除其他教师的课程。所以我希望他们只能看到列表中他们只拥有的那些课程。在一个 post 中,我看到了查询集函数并尝试实现它,但它没有解决我的问题。

您的代码大部分是正确的,但方法实际上是 get_queryset 而不是 queryset 您可能将其与查询集混淆了 属性

def get_queryset(self, request):
    qs = super(CourseAdmin, self).get_queryset(request)
    if request.user.is_superuser:
        return qs


    # get instructor's "owner" 
    return qs.filter(instructor__owner=request.user)

请注意,如果您是超级用户,您仍然可以看到其他人的课程,因此请确保您以低权限用户身份登录。您还需要更改另一个 class 中的方法名称。