Django — показывать сообщение только при изменении формы

#django #django-forms

#django #django-forms

Вопрос:

У меня есть форма, и каждый раз, когда форма обновляется, отображается сообщение «Ваш профиль обновлен». Это сообщение отображается, даже если в форме не было выполнено никаких изменений. Как я могу запретить форме показывать сообщение только при выполнении изменений?

views.py

 @login_required(login_url='login')
def profilePage(request):
    if request.method == 'POST':
        u_form = UserUpdateForm(request.POST, instance=request.user)
        p_form = ProfileUpdateForm(request.POST, request.FILES, instance=request.user.profile)
        if u_form.is_valid() and p_form.is_valid():
            u_form.save()
            p_form.save()
            messages.success(request, 'Your account {} has been updated'.format(request.user.username))
            return redirect('profile')
    else:
        u_form = UserUpdateForm(instance=request.user)
        p_form = ProfileUpdateForm(instance=request.user.profile)

    context = {
        'u_form': u_form,
        'p_form': p_form
    }
    return render(request, 'members/profile.html', context)
 

forms.py

 class ProfileUpdateForm(forms.ModelForm):
    phone_number = PhoneNumberField(label=False, widget=forms.TextInput(attrs={'placeholder': 'Phone Number'}))
    image = forms.ImageField(label=False)

    class Meta:
        model = Profile
        fields = ['phone_number', 'image', ]
 

Сообщение, используемое в шаблоне

 {% if messages %}
  <div class="prof-sucmessages">
      {% for message in messages %}
          <div class="alert-profile alert-{{ message.tags }} alert-dismissible" role="alert">
              <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                  <span aria-hidden="true">amp;times;</span>
              </button>
              {{ message }}
          </div>
      {% endfor %}
  </div>
{% endif %}
 

Спасибо за помощь!

Ответ №1:

Вы можете использовать form.has_changed() метод, чтобы увидеть, изменилось ли что-нибудь, что вы могли бы использовать следующим образом:

 if not u_form.has_changed() and not p_form.has_changed():
    # Don't perform the save operations and don't show a message
    # Return an empty successful message instead
    return HttpResponse(status=204)
 

По вашему мнению, это может стать:

 def profilePage(request):
    if request.method == 'POST':
        u_form = UserUpdateForm(request.POST, instance=request.user)
        p_form = ProfileUpdateForm(request.POST, request.FILES, instance=request.user.profile)
        if not u_form.has_changed() and not p_form.has_changed():
            # Don't perform the save operations and don't show a message
            # Return an empty successful message instead
            return HttpResponse(status=204)
        if u_form.is_valid() and p_form.is_valid():
            u_form.save()
            p_form.save()
            messages.success(request, 'Your account {} has been updated'.format(request.user.username))
            return redirect('profile')
    else:
        u_form = UserUpdateForm(instance=request.user)
        p_form = ProfileUpdateForm(instance=request.user.profile)

    context = {
        'u_form': u_form,
        'p_form': p_form
    }
    return render(request, 'members/profile.html', context)

if u_form.has_changed() or p_form.has_changed():
    // Don't perform the save operations and don't show a message
    // Return an empty successful message instead
    return HttpResponse(status=204)
 

Комментарии:

1. Спасибо за комментарий. Вы имеете в виду внутри представления? Не могли бы вы приложить свой код в моем примере?

2. Конечно, я обновлю свой ответ. Я предполагаю, что вы не хотите ничего делать, если форма не изменилась.

3. Правильно, я ничего не хочу делать. Но если поле изменено, все равно распечатайте сообщение и обновите поле. Спасибо!

4. Я обновил свой пример примером того, как использовать его в вашем представлении.