Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

remembering form field value on django model form

I am quite new to Django as such, and have been playing around with ModelForms. So far, I have been able to create ModelForms with ease. However, one problem seems to bug me a bit:

When a user fills the form, and if there is an error (say int instead of char or a missing blank=False value), the form spits out the error and seems to forget the values the user entered when the form failed to validate. I am wondering if there is a way to remember these values so that the user does not have to enter them again.

At the moment, I have something like the following:

class ContactForm(CreateView):

    form_class = ContactForm
    template_name = "superform.html"
    success_url = '/ty/'

    def form_valid(self, form):
        # do something useful with validated form
        return super(ContactForm, self).form_valid(form)

    def form_invalid(self, form):
        # do something useful with invalidated form.
        return super(ContactForm,self).form_invalid(form)

I am assuming I need to do something in form_invalid to pass the values back to the form - but I am unsure how to do this(?).

I would really appreciate if someone could point me in the right direction.

Thanks.

----Edit---

            <form class="form" role="form" action="{% url 'coolurl' %}" method="post">{% csrf_token %}

                    {% if form.non_field_errors %}
                      <div class="alert">
                      {% for error in form.non_field_errors %}
                      <span class="label">Error: {{ error|escape }}</span> 
                      {% endfor %}
                      </div>
                    {% endif %}


                    <div class="form-group">
                        {% if form.name.errors %}
                          <div class="alert">
                          {% for error in form.name.errors %}
                          <span class="label">Error: {{ error|escape }}</span> 
                          {% endfor %}
                          </div>
                        {% endif %}

                        <label class="col-sm-3" for="id_name">Name:</label>
                        <div class="col-sm-6">
                        <input class="form-control" 
                             id="id_name" 
                             type="text" 
                             name="name" 
                             maxlength="128" 
                             placeholder="Your name..">
                        </div>
                    </div>

                    <button type="submit" class="btn btn-success">Submit</button>
            </form>
like image 688
AJW Avatar asked Nov 27 '25 06:11

AJW


2 Answers

Try to mention the value of the input tag:

<input class="form-control" 
                             id="id_name" 
                             type="text" 
                             name="name" 
                             maxlength="128"
                             value="{{ form.name.value|default_if_none:'' }}"
                             placeholder="Your name..">
                        </div>
like image 103
arocks Avatar answered Nov 29 '25 19:11

arocks


You've taken the responsibility for rendering those fields away from Django by simply hard-coding them in the HTML. That means that Django has no way of inserting the current values; not only when redisplaying after errors, but also if you have a form that modifies existing database content.

Don't do it like that. I understand that you don't want to just juse form.as_p, but there is a good middle ground: output each field in the template with {{ form.my_field }}. You can add relevant classes to the fields in the definition in forms.py, and then Django will take care of outputting it correctly.

like image 25
Daniel Roseman Avatar answered Nov 29 '25 20:11

Daniel Roseman



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!