#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. Я обновил свой пример примером того, как использовать его в вашем представлении.