我使用的是django1.10,我需要显示数据并基于来自不同模型的值创建一个过滤器(它有一个外键引用了管理模板上使用的我的模型) 以下是我的两款车型: 此模板用于生成模板:
class Job(models.Model):
company = models.ForeignKey(Company)
title = models.CharField(max_length=100, blank=False)
description = models.TextField(blank=False, default='')
store = models.CharField(max_length=100, blank=True, default='')
phone_number = models.CharField(max_length=60, null=True, blank=True)
这是另一个包含外键引用的第一个:
^{pr2}$在我的模板中,我已经能够显示(最新)开始和结束时间
def start_date(self,obj):
if JobAdDuration.objects.filter(job=obj.id).exists():
tempad = JobAdDuration.objects.filter(job=obj).order_by("-id")[0]
return tempad.ad_activated
然后我把这个叫做列表显示,效果很好。 但是,我在使用这些条件设置过滤器字段时遇到了困难。在
如果我只是把它添加到我的list_过滤器中,我会得到一个错误:在我的模型中没有这样的字段,这是真的(因为这个字段在另一个引用了我的作业表的表中)。所以我想知道解决这个问题的正确方法是什么?我是否需要为过滤器本身创建另一个函数,但即使这样,我也不确定应该如何在list_过滤器中调用它。在
这是我的Django管理页面的一个片段。在
class JobAdmin(admin.OSMGeoAdmin, ImportExportModelAdmin):
inlines = [
]
readonly_fields = ( 'id', "start_date", )
raw_id_fields = ("company",)
list_filter = (('JobAdDuration__ad_activated', DateRangeFilter), 'recruitment', 'active', 'deleted', 'position', ('created', DateRangeFilter), 'town')
search_fields = ('title', 'description', 'company__name', 'id', 'phone_number', 'town')
list_display = ('title', 'id', 'description', 'active', 'transaction_number', 'company', 'get_position', 'town','created', 'expires', 'views', 'recruitment', 'recruits', 'paid', 'deleted', "start_date", "end_Date", "ad_consultant")
def start_date(self,obj):
if JobAdDuration.objects.filter(job=obj.id).exists():
tempad = JobAdDuration.objects.filter(job=obj).order_by("-id")[0]
return tempad.ad_activated
编辑: 同时,我试图用一个简单的列表过滤器来解决它,但是我无法使它工作。我想用一个日历(比如默认的DateRangeFilter)放置2个输入字段,它将表示开始和结束时间,然后根据这些值返回数据。这是我的“原型”功能的简单过滤器,它工作,但它返回硬编码数据。在
class StartTimeFilter(SimpleListFilter):
title = ('Start date')
parameter_name = 'ad_finished'
def lookups(self, request, model_admin):
#return JobAdDuration.objects.values_list("ad_finished")
return (
('startDate', 'stest1'),
('startDate1', 'test2')
)
def queryset(self, request, queryset):
if not self.value():
return queryset
assigned = JobAdDuration.objects.filter(ad_finished__range=(datetime.now() - timedelta(minutes=45000), datetime.now()))
allJobs = Job.objects.filter(pk__in=[current.job.id for current in assigned])
return allJobs
我最近遇到了类似的问题,我需要根据另一个模型的值过滤数据。这可以使用SimpleListFilter完成。您只需要在lookup和queryset函数中稍作调整。我建议您安装django调试工具栏,这样您就可以知道django在内部执行哪些sql查询。在
在列表过滤器中
^{pr2}$这并不是您所要求的,但是您可以在
JobAdDuration
modelAdmin上设置过滤器。这样,您就可以根据ad_activated
和ad_finished
字段筛选出相应的作业。我还添加了一个链接到job
字段,这样您就可以直接单击它以方便导航。在为了使它成为一个日期html5过滤器,我使用了django-admin-rangefilter库。在
如果您确实想走现有的路线(filter inside
JobAdmin
),那么事情会变得相当复杂。在我将使用定制的
FieldListFilter
,因为它允许根据您的需求将过滤器绑定到不同的模型字段。在接下来我们要做的是实现这样的过滤器:
expected_parameters
NotImplementedError
过滤代码:
形式可以简单如下:
^{pr2}$相关问题 更多 >
编程相关推荐