我有一个模型,看起来像这样:
class Event(models.Model):
event_dates = ManyToManyField("EventDate")
#...
class EventDate(models.Model):
event_date = DateField()
#...
但是,在EventAdmin
中为event_dates显示的django admin MultipleSelect
表单字段中,我想将查询集限制为不是过去的event_dates。
查询集应该类似于:
event_date_queryset = EventDate.objects.filter(event_date__gte = datetime.date.today())
但是,我可以在哪里设置这个查询集,以便只在字段中显示非过去的日期?
(我目前还没有针对EventAdmin
的自定义表单,但我很乐意添加一个。)
发布于 2013-05-22 14:42:28
您可以尝试:
event_dates = models.ManyToManyField("EventDate", limit_choices_to={'event_date__gte': date.today()})
但是,即使过去的一些日期仍然与Event
关联,也只显示未来的日期。
如果您还想要以前与Event
关联的所有日期,可以按如下方式操作ModelForm
from datetime import date
from django.contrib import admin
from django import forms
from django.db.models import Q
from models import Event, EventDate
class EventAdminForm(forms.ModelForm):
class Meta:
model = Event
def __init__(self, *args, **kwargs):
super(EventAdminForm, self).__init__(*args, **kwargs)
if 'event_dates' in self.initial:
self.fields['event_dates'].queryset = EventDate.objects.filter(Q(pk__in=self.initial['event_dates']) | Q(event_date__gte=date.today()))
else:
self.fields['event_dates'].queryset = EventDate.objects.filter(event_date__gte=date.today())
class EventAdmin(admin.ModelAdmin):
form = EventAdminForm
filter_horizontal = ['event_dates']
发布于 2016-04-13 23:43:39
最简单的方法是在管理员中执行此操作
你的模型
class Event(models.Model):
event_dates = ManyToManyField("EventDate")
#...
class EventDate(models.Model):
event_date = DateField()
#...
现在在您的管理文件中
这还有一个额外的优点,即它只返回使用反向查找event__id=event_id
查看的当前事件的事件日期
class EventAdmin(admin.ModelAdmin):
def get_field_queryset(self, db, db_field, request):
"""
If the ModelAdmin specifies ordering, the queryset should respect that
ordering. Otherwise don't specify the queryset, let the field decide
(returns None in that case).
"""
if db_field.name == 'event_dates':
event_id = int(request.resolver_match.args[0])
return db_field.remote_field.model._default_manager.filter(
event__id=event_id,
event_date__gte = datetime.date.today()
)
super().get_field_queryset(db, db_field, request)
https://stackoverflow.com/questions/16679269
复制相似问题