【问题标题】:Django form as_table(), as_p() methods not workingDjango form as_table(), as_p() 方法不起作用
【发布时间】:2014-03-07 21:34:38
【问题描述】:

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

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})

我将变量 {{ form.file_name }} 放入模板中只是为了验证表单字段是否存在。我的浏览器页面上显示的内容(以及模板中的所有其他内容)是:

<django.forms.fields.FileField object at 0x032A08F0> 

但是 form.as_table 似乎没有产生任何结果。

我尝试在我的视图中实例化表单后立即发出以下函数调用,就在调用 render() 函数之前:

打印(form.file_name) 打印(form.as_table())

服务器日志显示:

<django.forms.fields.FileField object at 0x032A08F0>

后跟一个空格。如果我删除对 as_table() 的调用,则不会出现空格。我尝试在视图中替换 form.as_p() ,但得到相同的结果,因此看来这两种方法都至少输出 CR 或 CR/FL 对。

除了 as_table()as_p() 方法之外,似乎一切正常,我不知道为什么......

++++++++++++++++++++++

在深入研究这一点时,我注意到另一个表单,当从模板中引用表单上的 Django 字段对象时,不会产生我上面发布的对象类描述,而是预期的表单字段。

所以我要问一下,下面两种建立表单域的方法有什么区别,有没有办法让第二种方法(__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')

【问题讨论】:

    标签: python django django-forms python-3.3


    【解决方案1】:

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

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

    等等

    编辑

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

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

    【讨论】:

    • 我可能应该包含我的视图代码 - 抱歉。编辑添加。您的建议确实让我回去验证,但是是的,我传递的是一个实例,而不是类。
    • 你给了我一个线索,告诉我这里可能出了什么问题,@DanielRoseman。见我上面的补充。 ——
    【解决方案2】:

    当有 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>
    

    查看文档

    【讨论】:

      猜你喜欢
      • 2016-04-19
      • 2013-09-06
      • 1970-01-01
      • 2023-01-31
      • 2015-09-18
      • 2017-12-08
      • 1970-01-01
      • 2019-12-23
      • 2013-09-07
      相关资源
      最近更新 更多