Форма начальной загрузки не показывает данные экземпляра - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь получить текущие данные экземпляра в форме начальной загрузки для обновления. Когда я использую {{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')

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Для людей, которые принимают мой код за основу, вот решение:

{% 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>
0 голосов
/ 29 августа 2018

Я определенно думаю, что это то, что каждый может извлечь выгоду. Я предполагаю, что вы, вероятно, захотите продолжить использование форм / дизайнов начальной загрузки для форм повсюду, поэтому лучший способ - создать еще один файл, из которого вы делаете магию, и затем использовать его каждый раз. Вот пример, который я получил от здесь .

{% 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 }}. Это также относится ко всему остальному, что отображается как код и отмечает его правильную форму. Надеюсь, это поможет!

...