如何使用request.GET中的初始值设置Django表单? (使用混合数据类型)

时间:2016-12-28 18:31:30

标签: django django-forms

我有一个同时包含CharFieldsChoiceFields的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)

但我不能相信这是最好的方法。

1 个答案:

答案 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存储信息。