我正在尝试接收POST
,然后生成包含新字段的表单,并将我在之前的POST
中收到的值作为隐藏变量传递。我在文档中做了很多搜索,似乎找不到任何连接这个流程的两面的东西。我正在使用Django 1.4 w / Python 2.7。
views.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})
forms.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())
myTemplate.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:
使用初始化字典是朝着正确方向迈出的一步!我现在能够看到表单中的可见字段,但隐藏的字段仍然没有填充。
views.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的隐身模式,一切正常。
答案 0 :(得分:2)
此代码存在明确问题:
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!