Django: 表单类自定义构造函数,访问request.POST数据时遇到问题
我写了一个自定义的表单构造函数,整个表单类看起来是这样的:
class UploadForm(forms.Form):
file = forms.FileField(label = "Plik")
def __init__(self, coto, naglowek, *args, **kwargs):
super(UploadForm, self).__init__(*args, **kwargs)
self.coto = coto
self.naglowek = naglowek
在提交表单时,我的视图中有这样的代码:
if request.method == 'POST':
form = UploadForm(request.POST, request.FILES)
if form.is_valid():
add_form(request.FILES['file'])
return HttpResponseRedirect('uploaded/')
问题是,当我在视图中以这种方式创建表单时,我没有传递coto和naglowek这两个参数,所以当我调用form.is_valid()时,它返回的是false。
传递这些参数的模板看起来是这样的:
<table class="uploadform">
<form action="." method="POST" enctype="multipart/form-data">
{% for form in forms %}
<tr>
<td>{{ form.naglowek }}</td>
<td>{{ form.file }}</td>
<td><input type="submit" name="{{ form.coto }}" id="{{ form.coto }}" value="Wyślij"></td>
</tr>
{% endfor %}
</form>
</table>
我会很感激任何建议。
[编辑]我可能没有说得很清楚,但我会尽量解释:
当我提交这个表单时,在视图中,我需要知道哪个提交按钮被按下了——我有很多按钮都是指向同一个表单的。根据我的了解,当我给提交按钮分配一个id时,它应该在post请求中可用,对吧?问题是,它并不可用。
我有两个问题: * 如果我想知道哪个提交按钮被按下了,我需要做什么?给按钮分配名字是唯一的方法吗? * 我的逻辑中有没有错误?
3 个回答
0
request.POST['coto']
request.POST['naglowek']
我想是这样。
0
你重新定义了默认的表单构造函数,并且改变了参数的顺序。所以你在创建自定义表单的时候,需要明确地指定每个参数的名字:
form = UploadForm(data=request.POST, files=request.FILES, coto=..., naglowek=...)
2
你的问题有点乱。里面有代码,还有一个编辑过的提问,那个编辑的问题和标题完全不相关。
请把这个问题更新成你真正想问的内容。
如果你有多个提交按钮,必须给它们不同的名字或值(或者两者都要)。下面是我们的代码,它用不同的值来区分哪个按钮被点击了。
<form method="post" action="." enctype="multipart/form-data">
<input type="hidden" name="object_id" value="{{e.id}}"/>
{% ifequal object.workflow "uploaded" %}
<input type="submit" name="action" value="Validate"/>
<br/>
<input type="submit" name="action" value="Delete"/>
{% endifequal %}
{% ifequal object.workflow "validated" %}
<input type="submit" name="action" value="Load"/>
{% endifequal %}
{% ifequal object.workflow "processed" %}
<input type="submit" name="action" value="Undo"/>
{% endifequal %}
{% ifequal object.workflow "failed" %}
<input type="submit" name="action" value="Validate"/>
{% endifequal %}
</form>
视图函数里有这样的内容:
if request.POST['action'] == "Delete":
根据按钮的不同来改变操作。