Пользовательская проверка электронной почты в форме DjangoPython

Программы на Python
Anonymous
Пользовательская проверка электронной почты в форме Django

Сообщение Anonymous »

В моем приложении учетной записи django у меня есть модель учетной записи

Код: Выделить всё

class Account(AbstractBaseUser):

wallet_value = models.DecimalField(max_digits=10, decimal_places=2, default=0.00)

first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
username = models.CharField(max_length=100)
email = models.EmailField(max_length=200, unique=True)
phone_number = models.CharField(max_length=20)

"""SOME OTHER REQUIED FIELD"""
date_joined = models.DateTimeField(auto_now_add=True)
last_login = models.DateTimeField(auto_now_add=True)
is_admin = models.BooleanField(default=False)

is_staff = models.BooleanField(default=False)
is_superadmin = models.BooleanField(default=False)
is_active = models.BooleanField(default=False)

USERNAME_FIELD = "email"

REQUIRED_FIELDS = ["first_name", "last_name", "username"]

У меня также есть форма регистрации, которая отвечает за функцию регистрации.

Код: Выделить всё

class RegistrationForm(forms.ModelForm):
password = forms.CharField(
widget=forms.PasswordInput(
attrs={
"class": "form-control",
}
)
)

confirm_password = forms.CharField(
widget=forms.PasswordInput(attrs={"class": "form-control"})
)
first_name = forms.CharField(
widget=forms.TextInput(
attrs={
"placeholder": "Enter First Name",
"class": "form-control",
}
)
)

last_name = forms.CharField(
widget=forms.TextInput(
attrs={"placeholder": "Enter Last Name", "class": "form-control"}
)
)
email = forms.CharField(
widget=forms.EmailInput(
attrs={
"placeholder": "Enter Email Adress",
"class": "form-control",
}
)
)

phone_number = forms.CharField(
widget=forms.NumberInput(
attrs={"placeholder": "Enter Phone Number", "class": "form-control"}
)
)

class Meta:
model = Account
fields = [
"first_name",
"last_name",
"email",
"phone_number",
"password",
"confirm_password",
]

def __init__(self, *args, **kwargs):
super(RegistrationForm, self).__init__(*args, **kwargs)

def clean(self):
cleaned_data = super(RegistrationForm, self).clean()
password = cleaned_data.get("password")
confirm_password = cleaned_data.get("confirm_password")
if password != confirm_password:
raise forms.ValidationError(
"password dose not match",
)
и в моем view.py, который будет обрабатывать регистрацию, я использую проверку формы, чтобы, если она действительна, я получал поля и создавал пользователя

Код: Выделить всё

if form.is_valid():
# get the fields
# create the user in database

теперь у меня есть сценарий, в котором пользователь вводит свою информацию в регистрационную форму, и ссылка активации будет отправлена ​​на его электронную почту, поэтому, как только он или она нажмет на ссылку активации, его или ее учетная запись будет активирована.
поэтому каждый раз, когда адрес электронной почты вводится в регистрационную форму, мне приходится проверять, есть ли этот адрес электронной почты в базе данных или нет.
если его нет в базе данных, создайте этого пользователя и отправьте активацию ссылку на это электронное письмо, но если оно есть в базе данных, мы должны знать, активировано это электронное письмо или нет. если да, мы выдадим ошибку о том, что этот адрес электронной почты существует в базе данных, поэтому войдите в систему, но если нет, мы должны проверить, истек ли срок действия предыдущей ссылки активации или нет... если да, отправьте еще одну ссылку активации и сообщите пользователю об этом. это, а если нет, просто сообщите пользователю, что на его электронную почту была отправлена ​​ссылка для активации и он должен ее активировать. Алгоритм примерно такой

Код: Выделить всё

# user click on registration button after fill the fields
if emailIsInDatabase:
if isAcitve:
raise forms.ValidationError("there is an account with this email. please signin")
else:
if activationLinkIsExpired:
# send another activation link
# inform the user about that
else:
# inform the user to activate his or her link
else:
# send the activation link to the email
Теперь задача здесь. Представьте себе ситуацию, когда пользователь регистрируется на веб-сайте с неправильным адресом электронной почты (то есть принадлежит другому человеку), поэтому после нажатия кнопки «Отправить» он или она понимает, что адрес электронной почты неправильный и зарегистрируйтесь с правильным адресом электронной почты. теперь, если другой пользователь, которому было адресовано первое электронное письмо, хочет создать учетную запись), когда он или она нажимает на отправку, используя этот адрес электронной почты, поскольку этот адрес электронной почты находится в базе данных и еще не активирован, проверка формы по уникальному адресу электронной почты value будет вызвано и выдаст ошибку о том, что с этим адресом электронной почты уже существует учетная запись, поэтому оно не войдет в условие form.is_valid(), поэтому мы не можем распознать, что нам нужно проверить ссылку активации.
Я уже пытался найти конкретную проверку электронной почты в форме и только что закончил эту часть в чистой функции в форме:

Код: Выделить всё

cleaned_data = super(RegistrationForm, self).clean() 
и однажды я удалил эту часть и просто использовал чистые данные от себя, например, clean_data = self.cleaned_data Это не проверяло уникальность электронного письма, но Я думаю, что это не очень хороший способ, потому что, делая это, я просто удаляю все другие проверки, которые форма выполняла для других параметров,
поэтому я ищу способ просто удалить проверку уникальности электронной почты
Я также использовал функцию clean_eamil для самостоятельной проверки электронной почты, но она не ответила, потому что после этого будет вызвана функция очистки, и моя собственная проверка бесполезна.
так в чем же здесь решение? Спасибо

Подробнее здесь: https://stackoverflow.com/questions/787 ... jango-form

Вернуться в «Python»