Как сделать так, чтобы значение поля формы django не обновлялось, если поле не подтверждено и пользователь нажимает submit
Я создал шаблон HTMl формы регистрации, и разработал его таким образом, что если есть какая-либо ошибка валидации, он выводит ошибку, и это работает нормально. Форма регистрации показывает ошибку "пароли не совпадают" Проблема, с которой я сталкиваюсь, заключается в том, что все поля формы очищаются, как только я нажимаю кнопку submit и появляются ошибки, то есть если пользователь получил ошибку "пароли не совпадают", то ему пришлось бы вводить все свои данные с нуля. Я хочу, чтобы пользователь вводил только те поля, в которых есть ошибки.
HTML-форма регистрации
` {% csrf_token %}
views.py для формы регистрации
def register_view(request):
form = CustomUserCreationForm()
if request.method == 'POST':
form = CustomUserCreationForm(request.POST)
if form.is_valid():
user = form.save()
login(request, user)
messages.success(request, f'{user.first_name}, your account has been created succesfully')
return redirect('home')
else:
messages.error(request, form.errors)
return render(request, 'base/register.html', {'form' : form })
Модель формы реестра
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from .models import UserModel из django import forms
class CustomUserCreationForm(UserCreationForm):
first_name = forms.CharField(
label='',
widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder':'Firstname'})
)
last_name = forms.CharField(
label='',
widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder':'Lastname'})
)
email = forms.CharField(
label='',
widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder':'Email'})
)
password1 = forms.CharField(
label='',
widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder':'Enter Password'})
)
password2 = forms.CharField(
label='',
widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder':'Enter Password again'})
)
class Meta:
model = UserModel
fields = ('email','first_name','last_name')
class CustomUserChangeForm(UserChangeForm):
class Meta:
model = UserModel
fields = ('email','first_name','last_name')
Я исправил эту проблему, проблема в том, что я отображал поля формы с помощью тега <Input....> вместо того, чтобы отображать их с помощью тегов Jinja, т.е. {{form.field}}
==== models.py ====
class EmployeeModel(models.Model):
name = models.CharField(max_length=255)
email = models.EmailField()
def __str__(self):
return self.name
==== forms.py ====
class EmployeeForm(forms.ModelForm):
class Meta:
model = EmployeeModel
fields = "__all__"
widgets = {
'name':forms.TextInput(attrs={'placeholder':'Enter Employee Name'}),
'email':forms.EmailInput(attrs={'placeholder':'Enter Employee E-Mail'}),
}
==== views.py ====
def EmployeeView(request):
if request.method == "POST":
form = EmployeeForm(request.POST)
if form.is_valid():
print("======= form is validated ============")
form.save()
messages.info(request,'Employee Added')
return redirect("/")
else:
print("======= form is not validated ============")
context= {'form':form}
return render(request,'index.html',context)
else:
form = EmployeeForm()
context= {'form':form}
return render(request,'index.html',context)
==== html код =====
{% block body %}
<div>
{% if messages %}
{% for msg in messages %}
{{msg}}
{% endfor %}
{% endif %}
</div>
<br>
<form action="" method="POST" novalidate >
{% csrf_token %}
<p>{{form.name.label}}:{{form.name}} {{form.name.errors|striptags}} </p>
<p>{{form.email.label}}:{{form.email}} {{form.email.errors|striptags}} </p>
<p><button type="submit">Add</button></p>
</form>
{% endblock body %}