gpt4 book ai didi

python - 在生成 Django 管理 URL 时覆盖查询集过滤器

转载 作者:行者123 更新时间:2023-11-28 18:43:03 25 4
gpt4 key购买 nike

我的 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 管理中的 Lecture 模型更改 ListView 仅显示处于“即将到来”和“进行中”状态的 Lectures。这很好用。

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

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

但是,当我这样做时,我得到了过滤后的查询集,其中缺少“已完成”状态的讲座。如何构造一个 url 反向函数来获取整个讲座查询集而不是过滤后的查询集?

最佳答案

这是一个解决方法,看起来很丑,我明白了。

all GET 参数添加到 changelist url:

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

调用get_queryset()super() 上,仅当 request.GET 中没有 all 时,才排除 Completed 状态:

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)})

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

希望它对你有用。

关于python - 在生成 Django 管理 URL 时覆盖查询集过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23916905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com