代码之家  ›  专栏  ›  技术社区  ›  Eran Kampf

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

  •  65
  • Eran Kampf  · 技术社区  · 16 年前

    使用时 {{ form.email }} 如果出现验证错误,Django仍然会呈现输入标记的value属性中的前一个值:

    <input type="text" id="id_email" maxlength="75" class="required"
           value="some@email.com" name="email">
    

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

    <input type="text" autocomplete="on" id="id_email" name="email"
           class="email {% if form.email.errors %} error {% endif %}">
    

    但是,这不会显示错误的值( some@email.com 在本例中)发送给用户。

    如何在模板中获取字段的值?

    11 回复  |  直到 7 年前
        1
  •  136
  •   Evgeny    13 年前

    这是一个在django1.3中修复的特性请求。

    问题是: https://code.djangoproject.com/ticket/10427

    基本上,如果您运行的是1.3之后的版本,那么在Django模板中,您可以执行以下操作:

    {{ form.field.value|default_if_none:"" }}
    

    或者在金盏2中:

    {{ form.field.value()|default("") }}
    

    请注意 field.value() () 省略了,而在Jinja2中,方法调用是显式的。

    如果您想知道您正在运行哪个版本的Django,它会在您执行runserver命令时告诉您。

    如果您使用的是1.3之前的版本,那么您可能可以使用上面bug中发布的修复程序: https://code.djangoproject.com/ticket/10427#comment:24

        2
  •  44
  •   LeeMobile    15 年前

    您可以通过以下方式从模板执行此操作:

    {% if form.instance.some_field %}
          {{form.instance.some_field}}
    {% else %}
          {{form.data.some_field}}
    {% endif %}
    

    这将显示实例值(如果窗体是用实例创建的,如果您愿意,可以使用initial),或者在发生验证错误时显示POST数据。

        3
  •  17
  •   arulmr    13 年前

    这似乎管用。

    {{ form.fields.email.initial }}
    
        4
  •  16
  •   Jens    16 年前

    {{ form.data.email }}
    

    非常简单的例子:

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

    希望对你有帮助。如果你有任何问题请告诉我。

        5
  •  9
  •   djvg Carl Meyer    6 年前

    {{ form.field_name.value }} 对我有用

        6
  •  5
  •   Eran Kampf    6 年前

    Jens提出的解决方案是正确的。 但是,如果您使用 实例 (以下示例)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)
    

    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)
    

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

    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()
    
        7
  •  3
  •   Durodola Opemipo    9 年前

    #forms.py
    class EditProfileForm(forms.ModelForm):
        first_name = forms.CharField(label='First Name',
                                     widget=forms.TextInput(
                                     attrs={'class': 'form-control'}),
                                     required=False)
        last_name = forms.CharField(label='Last Name',
                                     widget=forms.TextInput(
                                     attrs={'class': 'form-control'}),
                                     required=False)
        # username = forms.CharField(widget=forms.TextInput(
        #                              attrs={'class': 'form-control'}),
        #                              required=True)
        address = forms.CharField(max_length=255, widget=forms.TextInput(
                                     attrs={'class': 'form-control'}),
                                     required=False)
        phoneNumber = forms.CharField(max_length=11,
                                     widget=forms.TextInput(
                                     attrs={'class': 'form-control'}),
                                     required=False)
        photo = forms.ImageField(label='Change Profile Image', required=False)
    
        class Meta:
            model = User
            fields = ['photo', 'first_name', 'last_name', 'phoneNumber', 'address']
                      # 'username',
    
    
    
    #views.py
    def edit_user_profile(request, username):
        user = request.user
        username = User.objects.get(username=username)
        user_extended_photo = UserExtended.objects.get(user=user.id)
        form = EditProfileForm(request.POST or None, request.FILES, instance=user)
        user_extended = UserExtended.objects.get(user=user)
        if request.method == 'POST':
            if form.is_valid():
                # photo = UserExtended(photo=request.FILES['photo'] or None, )
                user.first_name = request.POST['first_name']
                user.last_name = request.POST['last_name']
                user_extended.address = request.POST['address']
                user_extended.phoneNumber = request.POST['phoneNumber']
                user_extended.photo = form.cleaned_data["photo"]
                # username = request.POST['username']
                user_extended.save()
                user.save()
    
                context = {
                    'form': form,
                    'username': username,
                    'user_extended_photo': user_extended_photo,
                }
    
                return render(request, 'accounts/profile_updated.html', context)
        else:
            photo = user_extended.photo
            first_name = user.first_name
            last_name = user.last_name
            address = user_extended.address
            phoneNumber = user_extended.phoneNumber
            form = EditProfileForm(
                initial={'first_name': first_name, 'last_name': last_name,
                                       'address': address, 'phoneNumber': phoneNumber,
                                       'photo': photo})
        context = {
            'form': form,
            'username': username,
            'user_extended_photo': user_extended_photo,
    
        }
        return render_to_response('accounts/edit_profile.html', context,
                                     context_instance=RequestContext(request))
    
    #edit_profile.html
      <form action="/accounts/{{ user.username }}/edit_profile/" method="post" enctype='multipart/form-data'>
                                        {% csrf_token %}
                                            <div class="col-md-6">
                                                <div class="form-group">
                                                    {{ form.as_p }}
                                                </div>
                                            </div>
                                        <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
                                        <button type="submit"  value="Update Profile" class="btn btn-info btn-fill pull-right">Update Profile</button>
                                        <div class="clearfix"></div>
                                    </form>
    

    我试图用一种方式来解释这一点,这样初学者可能会发现它更容易理解。密切关注 else:

            photo = user_extended.photo
            first_name = user.first_name
            last_name = user.last_name
            address = user_extended.address
            phoneNumber = user_extended.phoneNumber
            form = EditProfileForm(
                initial={'first_name': first_name, 'last_name': last_name,
                                      'address': address, 'phoneNumber': phoneNumber,
                                      'photo': photo}) 
    

    它是获得属性值的东西,例如:

    <p><label for="id_first_name">First Name:</label> <input class="form-control" id="id_first_name" name="first_name" type="text" value="Emmanuel" /></p>
    <p><label for="id_last_name">Last Name:</label> <input class="form-control" id="id_last_name" name="last_name" type="text" value="Castor" /></p>
    
        8
  •  2
  •   monofonik    15 年前

    如果用实例而不是POST数据填充了表单(如建议的答案所要求的),则可以使用{form.instance.my\u field\u name}访问数据。

        9
  •  2
  •   mutantacule    14 年前

    我想显示formset字段的值。我总结了这个解决方案,它应该也适用于正规形式:

    {% if form.email.data %} {{ form.email.data }}
    {% else %} {{ form.initial.email }} 
    {% endif %}
    

    上面的解决方案对我来说效果不太好,我怀疑它们在前缀形式(如向导和表单集)的情况下是否有效。 解决方案使用 {{ form.data.email }}

    {{form.field_name.value}} 仅Django 1.3+。

        10
  •  0
  •   bigwind    13 年前

    在django1.2上,{{form.data.field}}和{form.field.data}都可以,但不是{form.field.value}。
    正如其他人所说,{form.field.value}仅是Django 1.3+,但在中没有规范 https://docs.djangoproject.com/en/1.3/topics/forms/ . 可以在 https://docs.djangoproject.com/en/1.4/topics/forms/

        11
  •  -1
  •   shanyu    16 年前
    {{form.fields.email}}