首页 文章

Django形式为as_table(),as_p()方法不起作用

提问于
浏览
2

我有一个简单的表单类,定义了以下单个字段:

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 回答

  • 2

    您似乎将表单类本身而不是它的实例传递给模板 . 你应该做这样的事情:

    form = LaunchForm()
    return render(request, 'my_template.html', {'form': form})
    

    等等

    Edit

    要在 __init__ 中动态添加字段,您需要将其分配给 self.fields 字典:

    self.fields['file_name'] = forms.FileField(...)
    
  • 3

    当存在FileField时,您需要在表单中添加enctype以便发送文件:

    <form action="" method="post" enctype="multipart/form-data">
      {% csrf_token %}
        {{ form.file_name }}
        <table>
            {{ form.as_table }}
        </table>
        <input type="submit" value="Submit">
    </form>
    

    请参阅文档

相关问题