【问题标题】:Django: How to access form field input_type in a templateDjango:如何访问模板中的表单字段 input_type
【发布时间】:2012-11-08 22:35:52
【问题描述】:

我正在以这种方式渲染表单:

{% for field in form %}
    <div>
        {{ field.errors }}
        <input  name="{{field.name}}" type="{{field.widget.input_type}}" placeholder="{{field.name}}">
    </div>
{% endfor %}

但是,{{field.widget.input_type}} 在此处返回空字符串,尽管从 shell 中尝试它会生成 input_type。那么如何从模板中访问字段的输入类型呢?

我没有使用{{field}},因为我需要在每个输入字段中放置一个占位符。

编辑:

我刚刚使用了{{field}} 和一个简单的javascript,将每个输入元素字段中的占位符与元素名称相同,但我仍然想知道如何从模板访问widget.input_type

【问题讨论】:

  • 当您运行输出上述内容的代码时,您是否尝试过在处理后查看 field.widget.input_type 的输出?
  • @Thingover 是的,它什么也没显示,这意味着 Django 无法解析它,所以它只是“默默地”失败,正如文档所说:)
  • 尝试用 field.field.widget.input_type 替换 field.widget.input_type
  • field.field.widget.input_type 为我做了诀窍,就像@Tkingovr 说的那样

标签: django-forms


【解决方案1】:

我可以建议和替代方法来获得相同的东西吗?

试试看

attrs = {'placeholder':'your placeholder text here'}

像这样进入您的表单字段小部件:

formfield = SomeField(widget = SomeWidget(attrs = {'placeholder':'your placeholder text here'} ))

然后你就可以打印出来了

{{ field }} 

在模板中并完成它。

编辑:回应第一条评论。

由于我刚刚开始新项目并在页面顶部下载了带有漂亮时尚登录表单的 html5 样板文件,因此我必须完全按照我的建议进行操作。我是这样做的:

forms.py:

from django.contrib.auth.forms import AuthenticationForm

class MyAuthenticationForm(AuthenticationForm):
    def __init__(self, *args, **kwargs):
        super(MyAuthenticationForm, self).__init__(*args, **kwargs)
        self.fields['username'].widget.attrs['placeholder'] = self.fields['username'].label
        self.fields['password'].widget.attrs['placeholder'] = self.fields['password'].label

现在也许您的问题是您还想使用 django.contrib.auth.views.login 来登录用户,并且该视图使用 django 默认身份验证表单。没问题!

打开你的 urls.py 并使用这个魔法:

from yourapp.forms import MyAuthenticationForm
from django.contrib.auth.views import login

urlpatterns = patterns('',
    url(r'^login/$',
        login,
        {'template_name': 'yourapp/login.html', 'authentication_form':MyAuthenticationForm},
        name='auth_login'),
)

像魅力一样工作

【讨论】:

  • 问题是我无法访问表单域代码源代码,因为它是 Django 登录的内置表单。所以它对我来说是一个黑匣子。
  • 当然您也可以访问登录表单。导入它扩展它并用您自己的相同类型的字段替换它的字段 - 只需添加占位符文本:)
  • 但是内置的 django 身份验证系统使用他们的登录表单,而不是我的:) 我不想构建我的身份验证系统。无论如何我找到了解决方法,非常感谢:)
  • 您不需要构建自己的身份验证系统。这就是我在示例中显示的内容。看 - 系统同时使用 django 默认身份验证表单和视图。但是,如果您找到了另一个解决方案 - 只需在此处发布。也许其他人也觉得它有用
猜你喜欢
  • 2011-03-13
  • 2016-12-24
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-24
  • 2018-07-18
  • 1970-01-01
相关资源
最近更新 更多