生成django管理URL时覆盖查询集筛选器

时间:2014-05-28 16:18:10

标签: python django django-admin django-urls

我的models.py看起来像这样:

class Person(models.Model):
    Name = models.CharField(max_length=100)

class Lecture(models.Model):
    Speaker = model.ForeignKey(Person)
    Topic = models.CharField(max_length=100)
    Choices = ((1,"Upcoming"),(2,"In Progress",),(3,"Completed"))
    Status = models.SmallIntegerField(choices=Choices, default=1, max_length=1)

我的admin.py看起来像这样:

class LectureAdmin(admin.ModelAdmin):
    def get_queryset(self):
        return Lecture.objects.exclude(Status='Completed')

因此,我在演讲模型的django管理员中的更改列表视图仅显示“即将进入”和“进行中”状态的演讲。这很好。

现在我需要获取所有讲座列表的URL作为其他地方的视图传递。在django管理员中执行此操作的标准方法是通过反转URL,所以我这样做:

urlresolvers.reverse('admin:%s_%s_changelist' % (app_label, model_name))

然而,当我这样做的时候,我得到过滤的Queryset,其中Lectures处于“已完成”状态。我如何构建一个url反向函数来获取整个Lecture查询集,而不是过滤的查询集?

2 个答案:

答案 0 :(得分:1)

这是一种解决方法,看起来很难看,我理解。

all GET参数添加到changelist网址:

url = urlresolvers.reverse('admin:%s_%s_changelist' % (app_label, model_name))
url += '?all'

super()上致电get_queryset(),仅在Completed中没有all时排除request.GET状态:

class LectureAdmin(admin.ModelAdmin):
    def get_queryset(self, request):
        qs = super(LectureAdmin, self).get_queryset(request) 
        if 'all' not in request.GET:
            qs = qs.exclude(Status='Completed')
        return qs

UPD(应用request.GET中的其他过滤器):

from xadmin.plugin.related import RELATE_PREFIX  # or just set RELATE_PREFIX = '_rel_'

qs = qs.filter(**{key[len(RELATE_PREFIX):]: value 
                  for key, value in request.GET.iteritems() 
                  if key.startswith(RELATE_PREFIX)})

**将字典解压缩为关键字参数。

希望它适合你。

答案 1 :(得分:0)

get_queryset()是管理员列表中使用的基本查询集,因此,如果您以这种方式覆盖它,您就无法获取所有记录。

可能的解决方案:

  • Lecture创建代理模型,在admin中注册并在给定列表中使用已修改的get_queryset()。代理模型是必需的,因为每个模型只能注册单个AdminModel

models.py

class IncompletedLecture(Lecture):

    class Meta:
        proxy = True

admin.py

class IncompletedAdmin(admin.ModelAdmin):
    def get_queryset():
        return Lecture.query.exclude(Status='Completed')

admin.site.register(IncompletedLecture, IncompletedAdmin)
相关问题