如何在Django视图中创建/访问动态表单字段?

0 投票
1 回答
741 浏览
提问于 2025-04-16 02:00

我有一个系统,可以保存很多“记录”,现在需要加一个功能,能够生成所选记录的报告。

用户的操作流程是这样的:

  1. 点击“创建报告”
  2. 选择要包含在报告中的记录。
  3. 点击“提交”,然后就会显示报告。

从我的角度来看,我的想法是:

  1. 加载所有记录。
  2. 创建一个报告表单,这个表单会通过遍历第一步加载的所有记录,生成一个“布尔字段”(就是一个可以选择是或否的选项),代码大概是这样的:self.fields['cid_' + str(record.id)] = BooleanField()
  3. 返回HTML代码,期待能收到结果。
  4. 遍历所有以'cid_'开头的字段,创建一个要包含在报告中的记录ID列表。
  5. 把这些ID传给报告生成器。

但是在视图中,我无法用我想的方式访问表单数据。因为我不知道哪些记录ID是可用的(因为有些可能已经被删除了等),我需要这样访问:

{{form.fields['cid_'+str(record.id)']}}

但显然这样做是不合法的。

有没有人有什么建议?

1 个回答

1

如果我理解你的问题没错,你的答案在于使用合适的Django表单小部件。我给你举个例子。假设你有一个Django模型:-

class Record(models.Model):
    name = models.CharField()

假设你为你的需求创建了一个自定义表单:-

class MyCustomForm(forms.Form):
    records= forms.ModelMultipleChoiceField(queryset=Record.objects.all, widget=forms.CheckboxSelectMultiple)

假设你有以下视图:-

def myview(request):
    if request.method == 'POST':
        form = MyCustomForm(data=request.POST)
        if form.is_valid():
            #do what you want with your data
            print form.cleaned_data['records']
            #do what you want with your data
    else:
        form = MyCustomForm()
    return render_to_response('mytemplate.html', {'form': form}, context_instance=RequestContext(request))

你的 mytemplate.html 可能看起来像这样:-

<div>
    {{ form.records.label_tag }}
    {{ form.records }}
</div>

撰写回答