2009-01-05 17:20:15
Comments[0]
按照django源代码中ChoiceField的构造函数只需要定义Choices这个参数就可以构建一个选择按钮。
class ChoiceField(Field):
def __init__(self, choices=(), required=True, widget=Select, label=None, initial=None, help_text=None):
super(ChoiceField, self).__init__(required, widget, label, initial, help_text)
self.choices = choices
这个Choices参数可以是一个复合的列表或者元组类型,一个表示Choice的名称另一个表示Choice的值。通过这样构造表单应该可以按照选定的Choice来返还值。比如我需要通过一个名为Catagroy的models建立这个Choices,Catagory包括两个字段name和slug,那么这段代码应该类似:
choices=[(catagory.name,catagory.slug) for catagory in Catagory.all()]
这段代码在appengine里似乎有些问题,choices总是不能包括最近添加的选项。也就是说,本来你已经更新了添加了新的catagory,但是ChoiceField的选项并未随之更新,而ChoiceField的更新只在重启Develop Server或者改写代码之后,程序上传到服务器也是一样。不知道这是不是一个bug,或者Django的ChoiceField不是这样的用法。
最后我选择了用ModelChoiceField来代替ChoiceField,和ChoiceField不同的是ModelChoiceField接受的是一个查询,返还的是一个key而不是一个值,所以和Catagory关联的Post的catagory字段需要定义成一个ReferenceProperty。
catagory = djangoforms.ModelChoiceField(Catagory,query=Catagory.all())