Я использую django 1.10, и мне нужно отображать данные и создавать фильтр на основе значения из другой модели (у которой есть внешний ключ, ссылающийся на мою модель, которая используется в шаблоне администратора). Это мои 2 модели: используемый для генерации шаблона:
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)
Это другой, который содержит ссылку на внешний ключ для моего первого:
class JobAdDuration(models.Model):
job = models.ForeignKey(Job)
ad_activated = models.DateTimeField(auto_now_add=True)
ad_finished = models.DateTimeField(blank=True, null=True)
Внутри моего шаблона я смог отобразить (последние) время начала и окончания
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_display, и это работает нормально. Однако у меня возникли проблемы с настройкой поля фильтра с использованием этих критериев.
Если я просто добавлю его в свой список_filter, то я получаю сообщение об ошибке, что в моей модели нет такого поля, которое является истинным (так как оно находится в другой таблице, содержащей ссылку на мою таблицу заданий). Поэтому мне было интересно, какой правильный подход к решению этого? Нужно ли мне создавать другую функцию для самого фильтра, но даже тогда я не уверен, как мне его вызвать внутри list_filter.
Вот фрагмент моей административной страницы 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
EDIT: Тем временем я попытался решить проблему с помощью простого фильтра списка, но я не могу заставить его работать. Я хотел бы разместить 2 поля ввода с календарем (например, по умолчанию DateRangeFilter), который будет представлять собой начальное и конечное время, а затем возвращать данные на основе этих значений. Это моя "прототип" функциональности для простого фильтра, она работает, но возвращает жестко кодированные данные.
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