我有一个同时包含CharFields
和ChoiceFields
的django表单。表单使用HTTP GET
。
我遇到的问题是request.GET.dict()
每个键只包含一个值,无论数据是否为列表。我发现我可以使用request.GET.getlist()
来获取所有数据,但即使该项不是列表,它也会返回一个列表。这是有问题的,因为它会导致CharFields
具有值[u'']
解决问题的推荐方法是什么?
我目前的kludge如下:
initial_dict = {k: v for k, v in request.GET.iterlists()}
clean_dict = {}
for key, value in initial_dict.iteritems():
if value[0] == '':
clean_dict[key] = ''
elif len(value) == 1:
clean_dict[key] = value[0]
else:
clean_dict[key] = value
SellerSearchForm(initial=clean_dict)
但我不能相信这是最好的方法。
答案 0 :(得分:0)
我本人也遇到了这个问题,并且我希望能够为(部分)预填表格创建链接。我最后为表单创建了一个Mixin类,该类重写了get_initial_for_field()
方法(source)。
class InitialFromGETMixin:
def __init__(self, *args, initial_from_get=False, **kwargs):
super(InitialFromGETMixin, self).__init__(*args, **kwargs)
self.initial_from_get = initial_from_get
def get_initial_for_field(self, field, field_name):
"""
Special implementation of initial gathering if initial values are given through request GET object
"""
if self.initial_from_get:
value = self.initial.get(field_name)
if value is not None:
return value[0] if len(value) == 1 else value
else:
return field.initial
return super(InitialFromGETMixin, self).get_initial_for_field(field, field_name)
通过这种方式,至少表单负责将初始键转换为可读形式,类似于处理data属性的方式。但是除此之外,没有更好的选择,因为表单类不假定要在结构请求中提供初始数据。GET存储信息。