如何使用查询集在 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 中的方法名称。
我想为我的大学制作一个课程指导应用程序。这是我的 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 中的方法名称。