我的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查询集,而不是过滤的查询集?
答案 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()
是管理员列表中使用的基本查询集,因此,如果您以这种方式覆盖它,您就无法获取所有记录。
可能的解决方案:
Status='Completed'
或
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)