2

我正在尝试接收一个然后生成一个带有新字段的表单,并将我在之前收到的值作为隐藏变量POST传递。POST我在文档中进行了大量搜索,但似乎找不到任何连接此流程两侧的内容。我正在使用带有 Python 2.7 的 Django 1.4。

视图.py

from django.shortcuts import render_to_response
from gateway_interface.forms import newForm

def requestNewForm(request):
    if (request.method == "POST"):
        form = newForm(request)

        return render_to_response('myTemplate.html', {'form' : form})

表格.py

from django import forms
class newForm(forms.Form):
    def __init__(self, request):
        my_passed_variable = request.POST['pass_variable']

    a_new_variable = forms.CharField(max_length = 25)

    my_passed_variable = forms.CharField(widget = forms.HiddenInput())

我的模板.html

<form action="/myNextDjangoView/" method="post">
    <div class="fieldWrapper">
        I need this value: {{ form.a_new_variable }} <br>
    </div>

    {% for hidden in form.hidden_fields %}
        {{ hidden }}
    {% endfor %}
<input type="submit" value="Submit">
</form>

我一定是在做一些根本错误的事情。如果我在模板中使用 for 循环,则页面上不会显示任何可见字段。我尝试过的任何方法都没有导致隐藏字段填充。

有什么建议么?也许我在某处错过了进口?有什么我需要导入forms.py以允许使用的HiddenInput()吗?

编辑 1:我已修改forms.py为如下所示:

form django import forms
class newForm(forms.Form):
    a_new_variable = forms.CharField(max_length = 25)
    my_passed_variable = forms.CharField(widget = forms.HiddenInput())

    def __init__(self, *args, **kwargs):
        super(newForm, self).__init__(*args, **kwargs)

这并没有改变我的输出。我仍然得到相同的表单,没有显示字段(隐藏或可见)。我需要做的是使用初始化字典进行实例化。(我认为?)字典包含所有隐藏字段的名称和值。

initial_dict = { 'my_passed_variable' : request.POST.get('pass_variable') }
form = newForm(initial = initial_dict)

编辑2:

使用初始化字典是朝着正确方向迈出的一步!我现在可以看到表单中的可见字段,但隐藏字段仍未填充。

视图.py

from django.shortcuts import render_to_response
from gateway_interface.forms import newForm

def requestNewForm(request):
    if (request.method == "POST"):
        initial_dict = { 'my_passed_variable' : request.POST.get('pass_variable') }
        form = newForm(initial = initial_dict)

        return render_to_response('myTemplate.html', {'form' : form})

编辑 3:

我已经让它工作了。感谢 Jordan Reiter 将我推向了正确的方向。事实证明,问题几乎完全是我的浏览器在EDIT 1上面之后的缓存。我切换到 Chrome 的隐身模式,一切正常。

4

1 回答 1

3

这段代码有一个明确的问题:

from django import forms
class newForm(forms.Form):
    def __init__(self, request):
        my_passed_variable = request.POST['pass_variable']

    a_new_variable = forms.CharField(max_length = 25)

    my_passed_variable = forms.CharField(widget = forms.HiddenInput())

首先,有两个具有相同名称的变量非常令人困惑(尽管其中一个self.my_passed_variable在整个表单中都可用,而另一个仅在表单中my_passed_variable可用__init__)。我不禁认为你试图以某种方式将这两个变量联系在一起,但你不是。最坏/最好的情况(如果您重写my_passed_variable = request.POST['pass_variable']self.my_passed_variable = request.POST['pass_variable']),您正在用字符串覆盖表单字段对象的值。

其次,我假设你从__init__函数中剪掉了一堆代码。你错过了super实际上使它成为一种形式的东西。就目前而言,表单对象不会被正确实例化。

如果您正在尝试做我认为您正在尝试做的事情,那么您想以这种方式重写它:

from django import forms
class newForm(forms.Form):
    # first, I'm going to put the fields at the top, I think that's more standard
    a_new_variable = forms.CharField(max_length = 25)
    my_passed_variable = forms.CharField(widget = forms.HiddenInput())

    def __init__(self, request, *args, **kwargs):
        super(newForm, self).__init__(*args, **kwargs)
        self.fields['my_passed_variable'].initial = request.POST.get('pass_variable') # don't assume the variable is present!
于 2012-07-13T15:30:17.627 回答