在模板中显示django表单字段的值?

Era*_*mpf 70 django django-templates

我有一个带有电子邮件属性的表单.在出现某些验证错误的情况下使用{{form.email}}时,django仍会在输入标记的value属性中呈现前一个值:

<input type="text" id="id_email" maxlength="75" class="required"
       value="some@email.com" name="email">
Run Code Online (Sandbox Code Playgroud)

我想自己渲染输入标记(以便在出现错误时添加一些javascript代码和错误类).例如,这是我的模板,而不是{{form.email}}:

<input type="text" autocomplete="on" id="id_email" name="email"
       class="email {% if form.email.errors %} error {% endif %}">
Run Code Online (Sandbox Code Playgroud)

但是,这不会向用户显示错误值(在此示例中为"some@email.com").如何在模板中获取字段的值?

mli*_*ner 118

这是一个在Django 1.3中修复的功能请求.

这是错误:https://code.djangoproject.com/ticket/10427

基本上,如果你在1.3之后运行某些东西,在Django模板中你可以这样做:

{{ form.field.value|default_if_none:"" }}
Run Code Online (Sandbox Code Playgroud)

或者在Jinja2:

{{ form.field.value()|default("") }}
Run Code Online (Sandbox Code Playgroud)

注意,这field.value()是一个方法,但是在Django模板()中省略了,而在Jinja2中,方法调用是显式的.

如果你想知道你正在运行什么版本的Django,它会告诉你何时执行runserver命令.

如果您使用的是1.3之前的某些内容,您可以使用上述错误中发布的修补程序:https://code.djangoproject.com/ticket/10427#comment:24

  • 这有一个令人讨厌的效果,如果`form.field.value`是'None`,那么将显示文本"None".要改为显示空字符串,请使用`{{form.field.value | default_if_none:""}}` (18认同)

Lee*_*ile 40

您可以使用以下内容从模板执行此操作:

{% if form.instance.some_field %}
      {{form.instance.some_field}}
{% else %}
      {{form.data.some_field}}
{% endif %}
Run Code Online (Sandbox Code Playgroud)

这将显示实例值(如果表单是使用实例创建的,则可以根据需要使用initial),或者显示POST数据,例如发生验证错误时.

  • 遗憾的是,这个答案埋得太深了!这是在不向项目添加任何代码或修补django的情况下执行此操作的方法. (2认同)
  • 您能否将我正在填写的内容扩展到那些组成的字段?我尝试了一些变体,但没有奏效。 (2认同)

Ric*_*ich 15

这似乎有效.

{{ form.fields.email.initial }}
Run Code Online (Sandbox Code Playgroud)

  • 我可能弄错了,但我相信每次都会显示初始值.例如,尝试提交表单以便抛出错误,您将看到重新加载显示错误的表单将再次具有初始值,而不是用户在抛出错误之前输入的值. (11认同)

Jen*_*ens 14

我有一个简单的解决方案!

{{ form.data.email }}
Run Code Online (Sandbox Code Playgroud)

我试过这个并且它有效.这需要您的视图使用POST数据填充表单类.

很简单的例子:

def your_view(request):
  if request.method == 'POST':
    form = YourForm(request.POST)
    if form.is_valid():
      # some code here
  else:
    form = YourForm()

  return render_to_response('template.html', {'form':form})
Run Code Online (Sandbox Code Playgroud)

希望对你有所帮助.如果您有任何疑问,请告诉我.


rob*_*tzp 6

{{form.field_name.value}}适合我


Era*_*mpf 5

Jens提出的解决方案是正确的.但是,事实证明,如果使用实例初始化ModelForm (下面的示例),django将不会填充数据:

def your_view(request):   
    if request.method == 'POST':
        form = UserDetailsForm(request.POST)
        if form.is_valid():
          # some code here   
        else:
          form = UserDetailsForm(instance=request.user)
Run Code Online (Sandbox Code Playgroud)

所以,我创建了自己的ModelForm基类来填充初始数据:

from django import forms 
class BaseModelForm(forms.ModelForm):
    """
    Subclass of `forms.ModelForm` that makes sure the initial values
    are present in the form data, so you don't have to send all old values
    for the form to actually validate.
    """
    def merge_from_initial(self):
        filt = lambda v: v not in self.data.keys()
        for field in filter(filt, getattr(self.Meta, 'fields', ())):
            self.data[field] = self.initial.get(field, None)
Run Code Online (Sandbox Code Playgroud)

然后,简单视图示例如下所示:

def your_view(request):   if request.method == 'POST':
    form = UserDetailsForm(request.POST)
    if form.is_valid():
      # some code here   
    else:
      form = UserDetailsForm(instance=request.user)
      form.merge_from_initial()
Run Code Online (Sandbox Code Playgroud)