Django group选项列表

2024-04-25 11:57:44 发布

您现在位置:Python中文网/ 问答频道 /正文

使用Django,我有下面的工作示例来创建一个带有group选项的列表:

self.fields["crop"].choices = [( "First", ( ('1','aaa'), ('2','bbb'), ) ), ( "Second", ( ('3','ccc'), ) ), ]

第一种方法:我尝试使用硬方法使其动态化:

    sub_item =''
    grouped_items=''

    for k in Field.objects.filter(farm=farm):
      print (k.field_name )
      for o in Crop.objects.filter(farming_year=farming_year, field=k ): 
        sub_item = sub_item + '('+ str(o.id) + ',"' +o.crop_name  + '"),'
      grouped_items= grouped_items + '("' + k.field_name + '", (' + sub_item + ')),'
      sub_item=''
    full_list_items= '[' + grouped_items + ']'
    print (full_list_items)  
    self.fields["crop"].choices = full_list_items
    print(full_list_items )

我总是会遇到以下错误: 没有足够的值进行解包(预期值为2,实际值为1)

第二种方法:为了测试我的代码,我从终端复制了print(full\u list\u items)的结果,并将其直接分配到裁剪列表,如下所示,然后它再次工作!!!你知道吗

self.fields["crop"].choices = [( "First", ( ('1','aaa'), ('2','bbb'), ) ), ( "Second", ( ('3','ccc'), ) ), ] 

这里的问题是为什么我在使用第一种方法时不能得到所需的结果,而在使用第二种方法时却得到了所需的结果!!你知道吗


Tags: 方法namecropselffieldfields列表items
1条回答
网友
1楼 · 发布于 2024-04-25 11:57:44

你在建立一个字符串,而不是元组列表。我不知道你为什么这么做。与所有这些字符串串联不同,您应该保持Python数据结构:

grouped_items = []
for k in Field.objects.filter(farm=farm):
  sub_item = []
  for o in Crop.objects.filter(farming_year=farming_year, field=k): 
    sub_item.append((str(o.id), o.crop_name))
  grouped_items.append((k.field_name, sub_item))
self.fields["crop"].choices = grouped_items

请注意,内部循环可以重写为列表理解,并通过使用反向关系进一步简化:

sub_item = [(str(o.id), o.crop_name) for o in k.crop_set.filter(farming_year = farming_year)]

相关问题 更多 >