我正在尝试构建一个MultipleChoiceFilter
选项,其中的选择是相关模型(DatedResource
)上可能存在的日期的集合。
到目前为止,这是我正在使用的东西...
resource_date = filters.MultipleChoiceFilter(
field_name='dated_resource__date',
choices=[
(d, d.strftime('%Y-%m-%d')) for d in
sorted(resource_models.DatedResource.objects.all().values_list('date', flat=True).distinct())
],
label="Resource Date"
)
Run Code Online (Sandbox Code Playgroud)
当它显示在html视图中时...
最初,这很好用,但是,如果我创建DatedResource
具有新的不同date
值的新对象,则需要重新启动我的Web服务器,以使它们成为此过滤器中的有效选择。我相信这是因为该choices
列表是在Web服务器启动时进行一次评估的,而不是在每次我的页面加载时进行评估的。
有什么办法可以解决这个问题?也许通过一些创造性的使用ModelMultipleChoiceFilter
?
谢谢!
编辑:
我尝试了一些简单的ModelMultipleChoice
用法,但遇到了一些问题。
resource_date = filters.ModelMultipleChoiceFilter(
field_name='dated_resource__date',
queryset=resource_models.DatedResource.objects.all().values_list('date', flat=True).order_by('date').distinct(),
label="Resource Date"
)
Run Code Online (Sandbox Code Playgroud)
HTML表单显示得很好,但是选择不是过滤器可接受的值。我"2019-04-03" is not a valid value.
假设收到验证错误,因为此过滤器需要datetime.date
对象。我考虑过使用coerce
参数,但是ModelMultipleChoice
过滤器不接受这些参数。
根据狄克格罗滕的评论,我尝试使用链接问题中的建议。最终像
resource_date = filters.ModelMultipleChoiceFilter(
field_name='dated_resource__date',
to_field_name='date',
queryset=resource_models.DatedResource.objects.all(),
label="Resource Date"
)
Run Code Online (Sandbox Code Playgroud)
这也不是我想要的,因为HTML现在的形式是:a)显示str
每个的表示形式DatedResource
,而不是DatedResource.date
字段; …
django django-filters multiplechoicefield modelmultiplechoicefield