使用Django,我有以下工作示例以使用组选项列出列表:
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_list_items)的结果,并将其直接分配给裁剪列表,如下所示,它可以再次使用!
self.fields["crop"].choices = [( "First", ( ('1','aaa'), ('2','bbb'), ) ), ( "Second", ( ('3','ccc'), ) ), ]
这里的问题是为什么我在使用第一种方法时不能获得所需的结果,而在使用第二种方法时却得到了结果!
答案 0 :(得分:1)
您正在建立一个字符串,而不是一个元组列表。我不知道你为什么要这么做。代替所有这些字符串连接,您应该将其保留为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)]