Django: 表单类自定义构造函数,访问request.POST数据时遇到问题

-1 投票
3 回答
2831 浏览
提问于 2025-04-15 11:25

我写了一个自定义的表单构造函数,整个表单类看起来是这样的:

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/')

问题是,当我在视图中以这种方式创建表单时,我没有传递cotonaglowek这两个参数,所以当我调用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":

根据按钮的不同来改变操作。

撰写回答