简体   繁体   中英

Why the Django update method throwing error even though I am able to update the user profile successfully.?

I have a Django method written to update user profile. The purpose of the method is solved, as I am able to click on the "update" button and modify the existing data.

Note: I have written method to update Default User model and extended User model(custom fields). Below is the code snippet from views

views.py

@login_required(login_url="/login/")
def editUserProfile(request):
    if request.method == "POST":
        form = UserProfileUpdateForm(request.POST, instance=request.user)  # default user profile update
        obj = UserProfile.objects.get(user__id=request.user.id)
        form1 = UserProfileForm(request.POST or None, instance=obj)

        if form.is_valid() and form1.is_valid():
            obj.Photo = form1.cleaned_data['Photo']
            obj.dob = form1.cleaned_data['dob']
            obj.country = form1.cleaned_data['country']
            obj.State = form1.cleaned_data['State']
            obj.District = form1.cleaned_data['District']
            obj.phone = form1.cleaned_data['phone']
            form.save()
            form1.save()
            messages.success(request, f'updated successfully')
            return redirect('/profile1')
        else:
            messages.error(request, f'Please correct the error below.')
    else:
        form = UserProfileUpdateForm(instance=request.user)
        form1 = UserProfileUpdateForm(instance=request.user)
    return render(request, "authenticate\\editProfilePage.html", {'form': form, 'form1': form1})

corresponding HTML code. editProfilePage.html

{% load static %}
{% block content %}


<h2 class="text-center">Edit Profile</h2>
    <form method="POST" action="{% url 'editUserProfile' %}">
        {% csrf_token %}

        {% if form.errors %}
            <div class="alert alert-warning alert-dismissable" role="alert">
                <button class="close" data-dismiss="alert">
                    <small><sup>x</sup></small>
                </button>
                <p>Form has error..!!</p>
                {% for field in form %}
                    {% if field.errors %}
                        {{ field.errors }}
                    {% endif %}
                {% endfor %}
            </div>
        {% endif %}
            {{ form.as_p }}
            {{ form1.as_p }}
<!--            {{ form1.dob }}-->
<!--            {{ form1.country }}-->
<!--            {{ form1.State }}-->
<!--            {{ form1.District }}-->
<!--            {{ form1.phone }}-->

        <input type="submit" value="update" class="btn btn-secondry">
    </form>

    <br/><br/>

{% endblock %}

If one see in the first glance I do not see any issue immediately as my purpose of updating the profile is successful. However, to test, after I update a user profile I logout the user which redirects me to login page, and there I see error "Please correct the error below." three times which is coming from the "else" part of the update method. I also see a message "updated successfully" on the same login screen which is coming from the "if" part of the update method as mentioned above(screenshot attached -- update_error3).

So, I have below observations:

  1. My update method "editUserProfile" is somehow calling the inner most "if - else" together.
  2. I think the issue lies in the HTML page. I could say this because when I click on the "update" button from the profile page, I see "email" field appearing twice on the screen and the "update button to insert the data to database(screenshot attached -- update_error1).
  3. Now, I could see the rest of the fields only after I click on the "update" button further(screenshot attached -- update_error2). Furthermore, this is when I enter all my details and when I click on the "update" button, the data get saved successfully in the database and redirected to the profile page with the new data.

Finally, I think the issue is something related to the HTML code. May be I am wrong.

Any thought?

update_error1

更新错误2

更新错误3

The problem is with your messages rendering on the template.Just add this block of code to your base template that immediately extends your update template.

{% if messages %}
<ul class="messages ">
  {% for message in messages %}
  <ol class="breadcrumb ">
    <li{% if message.tags %} class="{{ message.tags }} " {% endif %}><strong>{{ message }} {{form.errors}}</strong>
      </li>
  </ol>
  {% endfor %}
</ul>
{% endif %}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM