我正在开发一个项目,我使用django表单类设计我的表单,问题是这样 我希望表单类中的ChoiceField从我的数据库中提取选项的值。我写了这样一个函数:
from django import forms
from django.forms.widgets import Select
from django.forms.fields import ChoiceField
import datetime
from mystore.store.models import categories
def header_search():
cat_values = ""
cats_list = categories.objects.all().order_by('category', 'values')
for cat in cats_list:
cat_values += "('%s', '%s'),"%(cat.values, cat.values)
return cat_values
mylist = header_search()
CATEGORY_CHOICES = (mylist)
class headersearch(forms.Form):
kywords = forms.CharField(max_length = 100)
category = forms.ChoiceField(widget=forms.Select, choices=CATEGORY_CHOICES)
当我使用manage.py shell运行它时,这个功能实际上有效,但每次我在服务器上尝试它我的错误页面:
/的TemplateSyntaxError 渲染时捕获ValueError:需要多于1个值才能解压缩。
答案 0 :(得分:1)
答案 1 :(得分:1)
为什么使用字符串表示列表?当你可以使用python时,这是相当不错的。
您的list(my_list)
应该只返回一个X字符列表。 list('abcd')
会产生['a', 'b', 'c', 'd']
。
choices
需要一个元组列表。只需修改代码即可返回元组列表,而不是元组列表的字符串表示形式。
def header_search():
cat_values = []
cats_list = categories.objects.all().order_by('category', 'values')
for cat in cats_list:
cat_values.append((cat.values, cat.values))
return cat_values
PS:使用此方法,您的选择只会填充一次(每次django加载)。如果你想要动态值,那么更合适的地方就是init函数。
class MyForm(..):
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
self.fields['category'].choices = my_choices