#python #django #forms #web #input
#python #django #формы #веб #ввод
Вопрос:
Я новичок в Django, только вчера начал его изучать. Я пытаюсь создать регистрационную форму. Я знаю, что существует встроенная система регистрации django. Но я пытаюсь сделать это сам. Это мой Views.py-
def register(request):
if request.user.is_authenticated:
return render(request, 'users.html', {})
else:
if (request.method=='POST'):
form=Register(request.POST)
if form.is_valid():
form.save()
return render(request,'home.html',{})
else:
return render(request,'register.html', {})
Шаблон-
<form method="post">
{% csrf_token %}
<input type="text" name="username" placeholder="Username" required><br>
<input type="email" name="username" placeholder="Email" required><br>
<input type="password" placeholder="Password" name="password" required><br>
<input type="password" placeholder="Password" name="cpassword" required><br>
<input type="radio" name="gender" value="male">Male
<input type="radio" name="gender" value="female">Female<br>
<input type="submit">
</form>
form.py
class Register(forms.ModelForm):
class Meta:
model = Users
fields = ["username", "email", "password","gender"]
Но поскольку в поле подтверждения пароля нет form.py . Он не проходит мимо инструкции form.is_valid().
Я знаю, что это может быть глупо. Но просто не могу найти способ сделать это.
Ответ №1:
чтобы проверить проверку пароля, вы можете использовать этот алгоритм в views.py
password = request.POST["password"]
confirmation = request.POST["cpassword"]
if password != confirmation:
return render(request, "register.html", {
"message": "Passwords must match."
})
и в шаблоне задайте действие формы, подобное этому
form action="{% url 'register' %}"
Вы должны либо использовать Django-forms с помощью forms.py или ручная форма, как вы сделали в шаблоне.
Для использования форм Django я рекомендую вам прочитать документы. https://docs.djangoproject.com/en/3.1/topics/forms /
Комментарии:
1. Вам также следует взглянуть на docs.djangoproject.com/en/3.1/ref/forms/validation и как переопределить clean(). Вероятно, вам потребуется удалить cpassword из cleaned_data.
2. я просмотрел статью, и мне удалось найти self.add_error (‘cpassword’, msg), чтобы удалить поле, но все равно это не работает.
Ответ №2:
Расширьте User
модель Django, чтобы добавить свои собственные файлы
Вы можете прочитать документацию о том, как это сделать.
В основном:
# models.py
from django.db import models
from django.contrib.auth.models import User
class MyUser(models.Model):
GENDERS = [("F", "female"), ("M", "male")]
user = models.OneToOneField(User, on_delete=models.CASCADE)
gender = models.CharField(max_length=1, choices=GENDERS, default="F")
Формы предназначены для проверки данных
У вас есть две модели, которые теперь связаны вместе: User
и MyUser
.
Вы должны проверять все данные на соответствие модели, которая будет их хранить. Это просто означает, что вам нужны две формы:
# forms.py
from django import forms
from django.contrib.auth.models import User
from myapp.models import MyUser
class UserRegister(forms.ModelForm):
class Meta:
model = User
fields = ["username", "email", "password"]
class MyUserRegister(forms.ModelForm):
class Meta:
model = MyUser
fields = ["gender"]
и ничего больше здесь, если вы используете Django ModelForm
, позвольте ему делать свое дело.
Представления используют формы и передают им данные
Итак, работа должна быть выполнена в представлении.
Вот пример того, как это сделать:
# views.py
from django.shortcuts import render
from myapp.forms import MyUserRegister, UserRegister
def register(request):
if request.user.is_authenticated:
return render(request, 'users.html', {})
else:
if (request.method == 'POST'):
user_form = UserRegister(request.POST)
myuser_form = MyUserRegister(request.POST)
if user_form.is_valid() and myuser_form.is_valid():
user_form.save()
# Now that the User is saved, associate it to the MyUser object before saving
myuser_form.instance.user = user_form.instance
myuser_form.save()
return render(request,'home.html',{})
else:
return render(request,'register.html', {})
Дополнительное примечание
Я изменил ваш шаблон, чтобы в нем были «M» и «F» в качестве вариантов, соответствующих моей модели:
<form method="post">
{% csrf_token %}
<input type="text" name="username" placeholder="Username" required><br>
<input type="email" name="username" placeholder="Email" required><br>
<input type="password" placeholder="Password" name="password" required><br>
<input type="password" placeholder="Password" name="cpassword" required><br>
<input type="radio" name="gender" value="M">Male
<input type="radio" name="gender" value="F">Female<br>
<input type="submit">
</form>
Надеюсь, это немного прояснит ваши вопросы.