我有一个简单的表单类,定义了以下单个字段:
class LaunchForm(forms.Form):
file_name = forms.FileField(required=True, label='File to import')
在我的模板中我有:
<form action="" method="post">
{{ form.file_name }}
<table>
{{ form.as_table }}
</table>
{% csrf_token %}
<input type="submit" value="Submit">
</form>
从视图中调用表单如下:
class Application_Launch_View(View):
form_class = LaunchForm
template_name = 'application_launch.html'
def get(self, request, app_id):
form = self.form_class(application_id=app_id)
return render(request, self.template_name, {'form': form})
我将变量 {} 放入模板只是为了验证表单字段是否存在 . 我浏览器页面上出现的内容(以及模板中的所有其他内容)是:
<django.forms.fields.FileField object at 0x032A08F0>
但是form.as_table似乎没有产生任何东西 .
在调用render()函数之前,我尝试在视图中实例化表单后立即发出以下函数调用:
print(form.file_name)print(form.as_table())
服务器日志显示:
<django.forms.fields.FileField object at 0x032A08F0>
随后是一个空白区域 . 如果我删除对as_table()的调用,则不会出现空格 . 我尝试在视图中替换form.as_p(),但得到相同的结果,因此看起来这两种方法至少输出CR或CR / FL对 .
看起来除了 as_table() 和 as_p() 方法之外一切正常,我无法弄清楚为什么......
在深入研究这个问题时,我注意到另一种形式,当从模板中引用表单上的Django字段对象时,不会产生我上面发布的对象类描述,而是预期的表单字段 .
所以我不得不问,下面两种方法 Build 表单字段有什么区别,有没有办法让第二种方法(在 __init__()
内)工作?
方法1(这是有效的):
class LaunchForm:
file_name = forms.FileField(required=True,
label='File to import',
initial='Default value')
方法2(这不起作用):
class LaunchForm:
def __init__(self, *args, **kwargs)
self.file_name = forms.FileField(required=True,
label='File to import',
initial='Default value')
2 回答
您似乎将表单类本身而不是它的实例传递给模板 . 你应该做这样的事情:
等等
Edit
要在
__init__
中动态添加字段,您需要将其分配给self.fields
字典:当存在FileField时,您需要在表单中添加enctype以便发送文件:
请参阅文档