4

我有一个巨大的 django 表单,我需要创建 dict,其中键是模板中的字段 id,值是初始值?像这样的东西:

{'field1_id_in_template': value1, ...}

有人知道怎么做吗?

我可以为 form.fields 字典中的每个字段名称添加前缀“id_”,但如果有人更改 widget.attrs 的 id,我可能会遇到问题

回答:

这是CBV的方法:

def post_ajax(self, request, *args, **kwargs):
    form = ChooseForm(request.POST, log=log)
    if form.is_valid():
        instance = form.save()
        inst_form = InstanceForm(instance=instance, account=request.user)
        fields = {}
        for name in inst_form.fields:
            if name in inst_form.initial:
                fields[inst_form.auto_id % name] = inst_form.initial[name]
        return HttpResponse(
            json.dumps({'status': 'OK','fields':fields},
            mimetype='appplication/json'
        )
    assert False

这就是我这样做的原因:有了这个响应,我可以在客户端上写这样的东西。现在我不需要手动初始化页面上的所有字段

function mergeFields(data) { 
    for(var id in data) { 
        $("#"+id).val(data[id]).change(); 
    } 
} 
4

2 回答 2

0

你可以试试getattr

例如,您有一个已知的密钥列表

['field1_id_in_template', 'field2_id_in_template', ...]

然后:

my_values = dict()
for key in key_list:
    value = getattr(your_form, key)
    # now do something with it
    my_values[key] = deal_with(value)
于 2013-07-16T15:33:44.270 回答
0

如果您将 auto_id 设置为 True,那么您可以使用 form_object_instance.field_name.auto_id 获取 id。考虑到这一点,您可以通过迭代表单对象来创建您的 dict。

我只是想知道为什么您需要进行这样的处理,因为表单对象通常用于封装此类行为......

于 2013-07-16T14:13:53.957 回答