0

我在 Django 中有一个表格:

class UploadForm(forms.Form):
    klarf_files = forms.FileField(label='Select a file')
    pixel_size = forms.CharField()
    fov = forms.CharField()
    template_recipe = forms.CharField()
    template_target = forms.CharField()

当我发布表单时,我只得到 klarf_files 字段而不是其他任何字段。表单没有文档所说的cleaned_data字典,但我可以通过这样做来获取文件:

form = UploadForm(request.POST, request.FILES)
files = request.FILES.getlist('klarf_files')

但我也需要其他人。在搞砸了一天多之后,我决定强行使用它并将参数添加到表单的动作属性中,例如:

$('#upload').attr('action', "?pixel_size="+$('#pixel_size').val());

这可行,但这产生了一个不同的问题:我希望表单转到某个视图。在我原来的形式中,我有这个:

<form id="upload" method="POST" enctype="multipart/form-data"
  action="/report/CDSEM/DR4iBeta/dr4iupload/">

我添加了一个 onsubmit 函数,这样我就可以将我的参数添加到 action 属性中,但这似乎使它忽略了表单操作。我发现它并没有走上面的观点,而是去/report/CDSEM/DR4iBeta/。所以然后我尝试在 onsubmit 函数中重定向它,但这把它变成了一个 GET 并且我丢失了文件。

我想知道为什么我没有按我应该的方式获取表单的cleaned_data 字典,或者我想知道如何添加参数并且仍然让它成为一个POST 并转到我需要它的地方。

这是我的模板:

  <form id="upload" method="POST" enctype="multipart/form-data"
  action="{% url motor.core.reports.views.upload the_controller.app.name the_controller.get_name %}">
  {% csrf_token %}
  <label for="id_pixel_size">Pixel Size</label><br />
  <input type="text" value="{{ pixel_size_default }}" id="id_pixel_size" name="pixel_size">
  <label for="id_fov">FOV</label><br />
  <input value="{{ fov_default }}" id="id_fov" name="fov">
  <label for="id_template_recipe">Template Recipe</label><br />
  <input value="{{ template_recipe_default }}" id="id_template_recipe" name="template_recipe">
  <label for="id_template_target">Template Target</label><br />
  <input value="{{ template_target_default }}" id="id_template_target" name="template_target">
  <input type="file" name="klarf_files" id="klarf_files" multiple=""/>
  <input type="submit" class="submit" value="Upload"/>
  </form>
4

1 回答 1

2

在表单被验证之前,表单不会有cleaned_data。执行此操作的传统方法是检查is_valid接受表单的视图:

if form.is_valid():
    klarf_file = form.cleaned_data['klarf_files']
    # and further processing as needed
else:
    # traditionally you rerender the form display template here to show errors

我认为这是您问题的核心 - 根本不需要尝试通过在操作中手动插入参数来解决它。

于 2013-05-15T21:36:52.560 回答