我很感激你的帮助朋友,因为我是新来的,有几件事我不掌握!
我有一个数据记录,每个记录中都保存了一个日期,然后我需要根据保存的日期显示信息,当在我的选择中查看日期数据时,它显示如下
输入图片描述
这是我的forms
的代码,我创建了select
,我想我的问题的答案是修改ORM(我已经尝试了几种方式,我不能这样做),数据必须是distinct
,这样月份就不会重复
class Report2Form(Form):
reportDate = ModelChoiceField(
queryset=ConsElect.objects.values_list('date', flat=True),
widget=Select(attrs={
'class': 'form-control',
# ('F , Y') This is how it appears to me as 'April, 2023'
}),
)
这是我的模型
class ConsElect(models.Model):
pgd = models.ForeignKey(TipoPGD, on_delete=models.CASCADE, related_name='conselect')
date= models.DateField(default=datetime.now)
read_morning = models.IntegerField(default=0)
read_day = mod
我需要帮助,以便我的选择是我所需要的!
您可能正在寻找使用"month"作为"善良"的论点。"month"kind will,根据链接的文档,"返回字段中所有不同的年/月值的列表。">有关更多示例和选项,请参阅https://docs.djangoproject.com/en/dev/ref/models/querysets/#dates的文档。
过滤器将变成如下内容:
queryset=ConsElect.objects.dates("date", "month")
我相信在您的情况下,您希望使用ChoiceField而不是ModelChoiceField。选择不绑定到特定的记录,而是一个计算的月份和年份组合列表。注意,选择字段使用'选择'而不是queryset。将过滤器放入__init__
方法将获得日期的当前列表。如果您在字段定义中这样做,则在您上次重新启动服务后输入的记录将不包括在内,因为它们将按您启动服务时计算。
试试这样写:
class Report2Form(Form):
report_date = ChoiceField(
choices=[],
widget=Select(attrs={
'class': 'form-control',
# ('F , Y') This is how it appears to me as 'April, 2023'
}),
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['report_date'].choices = [(f"{d:%Y-%m}", f"{d:%B, %Y}") for d in ConsElect.objects.dates("date", "month")]
在您的views.py
中,您可以这样调用:
form = Report2Form()
我没有测试上面的代码,直接在这里输入,所以它可能会稍微偏离。我建议将其更改为选择字段,因为它并不是真正指向或绑定到ConsElect
中的记录。相反,它是在表单实例化时评估的选项列表,因此新输入的日期将包含在选项中。选择结果是一个类似于[("2023-03", "March, 2023"),]的元组列表。这将把元组的第一个元素放在select的值中,第二个元素作为对用户可见的显示文本。