【问题标题】:Bootstrap form does not show instance's data引导表单不显示实例的数据
【发布时间】:2019-02-03 12:27:16
【问题描述】:

我正在尝试检索实例的当前数据以引导表单进行更新。当我使用{{user_form.as_p}} 时,所有当前数据都会自动填充,但是用引导表单替换它似乎是空的。这是我的 python 和 html 文件:

views.py

def update_profile(request):

   if request.method == 'POST':
        user_form = RegisterForm(request.POST, instance=request.user)
        if user_form.is_valid():
            user_form.save()
            return redirect('profile')

    else:
        user_form = RegisterForm(instance=request.user)

    return render(request, 'blog/update_profile.html', {
        'user_form': user_form,
    })

update_profile.html

<form method="post">
    {% csrf_token %}
    <div class="form-group">
      <label for="formGroupExampleInput">Name</label>
      <div id="formGroupExampleInput">
        <input class="form-control" name="first_name"  maxlength="150" autofocus required="" id="id_first_name" type="text" placeholder="First name" >
      </div>
    ...      
    <div class="form-group">
     <button type="submit" class="btn btn-success" id="formGroupExampleInput5">Save changes</button>
   </div>
</form>

forms.py

class RegisterForm(UserCreationForm):
   email = forms.EmailField(max_length=200, help_text='Required')

   class Meta:
        model = User
        fields = ('first_name', 'last_name', 'username', 'email', 'password1', 'password2')

【问题讨论】:

  • 你在哪里渲染表单?
  • ... 或细化问题:您是否将 {{user_form.as_p}} 放入引导模板中?
  • 渲染没问题我测试过了。当我使用{{user_form.as_p}} 时,检索到的所有数据除了密码。如果我使用{{user_form.first_name}},它会再次起作用。但我无法使用{{user_form.first_name}} 在此输入标签&lt;input class="form-control" name="first_name" maxlength="150" autofocus required="" id="id_first_name" type="text" placeholder="First name"&gt; 中集成代码。 @WillemVanOnsem
  • 我可以使用但不能在输入标签中使用。value="{{user_form.first_name }}" 也不起作用。 @ger.s.brett
  • 用{{user_form.as_p}}替换输入标签

标签: python django django-forms bootstrap-4


【解决方案1】:

我绝对认为这是每个人都可以从中受益的事情。我想你可能会想要继续使用引导表单/设计表单,所以最好的方法是创建另一个文件,你可以从中执行魔法——然后每次都重用它。 这是我从here 那里得到的一个例子。

{% load widget_tweaks %}

{% for hidden_field in form.hidden_fields %}
  {{ hidden_field }}
{% endfor %}

{% if form.non_field_errors %}
  <div class="alert alert-danger" role="alert">
     {% for error in form.non_field_errors %}
      {{ error }}
    {% endfor %}
  </div>
{% endif %}

{% for field in form.visible_fields %}
  <div class="form-group">
    {{ field.label_tag }}

    {% if form.is_bound %}
      {% if field.errors %}
        {% render_field field class="form-control is-invalid" %}
        {% for error in field.errors %}
          <div class="invalid-feedback">
            {{ error }}
          </div>
        {% endfor %}
      {% else %}
        {% render_field field class="form-control is-valid" %}
      {% endif %}
    {% else %}
      {% render_field field class="form-control" %}
    {% endif %}

    {% if field.help_text %}
      <small class="form-text text-muted">{{ field.help_text }}</small>
    {% endif %}
  </div>
{% endfor %}

然后按如下方式通过模板传递(上面的代码位于名为 bs4_form.html 的文件中):

<form method="post" novalidate>
  {% csrf_token %}
  {% include 'includes/bs4_form.html' with form=form %}
  <button type="submit" class="btn btn-primary">Submit</button>
</form>

就我个人而言,我在渲染错误时遇到了问题,但可以通过使用{{ error.as_p }} 而不是{{ error }} 来快速解决这个问题。这也适用于任何其他呈现为代码并注意其正确形式的东西。 希望这会有所帮助!

【讨论】:

  • 谢谢@Felix,太好了,甚至不需要用for循环为每个字段使用一行,它自己检测所有区域类型。
【解决方案2】:

对于那些把我的代码作为问题基础的人,这里是解决方案:

{% load widget_tweaks %}

  <form method="post" enctype= "multipart/form-data">
    {% csrf_token %}


    {% for hidden_field in user_form.hidden_fields %}
      {{ hidden_field }}
    {% endfor %}

    {% for field in user_form.visible_fields %}
      <div class="form-group">
        {{ field.label_tag }}
        {% render_field field class="form-control" %}
        {% if field.help_text %}
          <small class="form-text text-muted">{{ field.help_text }}</small>
        {% endif %}
      </div>
    {% endfor %}

      <button type="submit" class="btn btn-success" id="formGroupExampleInput5">Save changes</button>

    </div>
  </form>

【讨论】:

    猜你喜欢
    • 2018-05-13
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    相关资源
    最近更新 更多