Django admin 添加表单 - 当日期在范围内时通过外键限制显示模型的数量
Django admin Add form - Limit number of displayed Model by foreign key when date is within range
假设我有以下简单模型:
class Dimdate(models.Model):
id = models.AutoField(db_column='Id', primary_key=True) # Field name made lowercase.
date = models.DateField(db_column='date') # Field name made lowercase.
这个table被许多其他模型使用(所以Dimdate.id是FK)如下:
class MyModel(models.Model):
id = models.AutoField(db_column='Id', primary_key=True) # Field name made lowercase.
dateid = models.ForeignKey(Dimdate, models.DO_NOTHING, db_column='DateId', blank=True, null=True) # Field name made lowercase.
# ...
我的问题是 DimDate table 包含太多记录。当使用 Django admin UI 添加新的 MyModel
实例时,下拉菜单显示了我所有的 DimDate,这使得它对用户不友好。
我进行了快速 google 搜索,但没有发现任何东西可以限制在下拉菜单中检索和显示的 DimDate 元素的数量(添加 MyModel 实例时)。
我可以过滤我的 dimdate 以仅包含从过去 1 个月到未来 1 个月的日期吗?
例如:如果我们是 2020 年 1 月 27 日。日期范围是:[27/12/2019, 27/02/2020]
我目前正在使用 django 的管理 "classic" 方法(无自定义表单):
@admin.register(models.MyModel)
class MyModelAdmin(admin.ModelAdmin):
我怀疑我需要覆盖 MyModel 表单。但即使这样做。如何限制我的表单中检索到的 DimDate 的数量?
有没有更简单的方法(因为我是 Django 的新手...)?
如果需要,我使用的是 Django 2.2.6
在您的管理配置中使用 raw_id_fields
来防止加载所有对象
@admin.register(models.MyModel)
class MyModelAdmin(admin.ModelAdmin):
raw_id_fields = ('dateid',)`
它显示如下,您可以 select 在新 window 上单击它时反对
如果您只想过滤下拉项目,您可以将 limit_choices_to
添加到您的外键字段,如下所示:
def limit_dim_date_choices():
return {'date__range': (date(2019,12,27), date(2020,2,27))}
class MyModel(models.Model):
id = models.AutoField(db_column='Id', primary_key=True) # Field name made lowercase.
dateid = models.ForeignKey(Dimdate, limit_choices_to=limit_dim_date_choices, models.DO_NOTHING, db_column='DateId', blank=True, null=True) # Field name made lowercase.
# ...
假设我有以下简单模型:
class Dimdate(models.Model):
id = models.AutoField(db_column='Id', primary_key=True) # Field name made lowercase.
date = models.DateField(db_column='date') # Field name made lowercase.
这个table被许多其他模型使用(所以Dimdate.id是FK)如下:
class MyModel(models.Model):
id = models.AutoField(db_column='Id', primary_key=True) # Field name made lowercase.
dateid = models.ForeignKey(Dimdate, models.DO_NOTHING, db_column='DateId', blank=True, null=True) # Field name made lowercase.
# ...
我的问题是 DimDate table 包含太多记录。当使用 Django admin UI 添加新的 MyModel
实例时,下拉菜单显示了我所有的 DimDate,这使得它对用户不友好。
我进行了快速 google 搜索,但没有发现任何东西可以限制在下拉菜单中检索和显示的 DimDate 元素的数量(添加 MyModel 实例时)。 我可以过滤我的 dimdate 以仅包含从过去 1 个月到未来 1 个月的日期吗?
例如:如果我们是 2020 年 1 月 27 日。日期范围是:[27/12/2019, 27/02/2020]
我目前正在使用 django 的管理 "classic" 方法(无自定义表单):
@admin.register(models.MyModel)
class MyModelAdmin(admin.ModelAdmin):
我怀疑我需要覆盖 MyModel 表单。但即使这样做。如何限制我的表单中检索到的 DimDate 的数量?
有没有更简单的方法(因为我是 Django 的新手...)?
如果需要,我使用的是 Django 2.2.6
在您的管理配置中使用 raw_id_fields
来防止加载所有对象
@admin.register(models.MyModel)
class MyModelAdmin(admin.ModelAdmin):
raw_id_fields = ('dateid',)`
它显示如下,您可以 select 在新 window 上单击它时反对
如果您只想过滤下拉项目,您可以将 limit_choices_to
添加到您的外键字段,如下所示:
def limit_dim_date_choices():
return {'date__range': (date(2019,12,27), date(2020,2,27))}
class MyModel(models.Model):
id = models.AutoField(db_column='Id', primary_key=True) # Field name made lowercase.
dateid = models.ForeignKey(Dimdate, limit_choices_to=limit_dim_date_choices, models.DO_NOTHING, db_column='DateId', blank=True, null=True) # Field name made lowercase.
# ...