Benutzerdefinierte E -Mail -Validierung im Django -Formular
Posted: 13 Apr 2025, 09:55
In meiner Django -Konto -App habe ich ein Modell für Konto < /p>
Und sobald ich diesen Teil entfernt habe und einfach die sauberen Daten von selbst wie dieses Cleaned_data = self.cleaned_data verwendete. Einzigartigkeit
Ich habe auch die Funktion Clean_eamil verwendet, um meine eigenen E -Mails speziell zu validieren, aber sie wurde nicht geantwortet, da die saubere Funktion danach aufgerufen wird und meine eigene Validierung nutzlos ist.
Also, was ist die Lösung hier? Danke
Code: Select all
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"]
< /code>
Ich habe auch ein Registrierungsformular, das für die Anmeldungsfunktion verantwortlich ist < /p>
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",
)
< /code>
und in meinen Ansichten.Py, die die Registerverhandlung verwendete. Ich verwende die Validierung des Formulars, damit ich die Felder, wenn es gültig istif form.is_valid():
# get the fields
# create the user in database
< /code>
Jetzt habe ich einen Senario, in dem der Benutzer seine Informationen in Registrierungsformular eingibt, und ein Aktivierungslink wird an seine E -Mail gesendet. Sobald er oder ihre Klicks auf den Aktivierungslink klickt, wird sein Konto aktiviert. Wenn es sich jedoch in der Datenbank befindet, müssen wir wissen, ob die E -Mail aktiviert ist oder nicht. Wenn ja, werden wir einen Fehler ansprechen, dass diese E -Mail in der Datenbank vorhanden ist, also müssen wir jedoch überprüfen, ob der vorherige Aktivierungslink abgelaufen ist oder nicht ... Wenn ja, senden Sie einen weiteren Acitvation -Link und informieren Sie den Benutzer darüber. Wenn nicht, informieren Sie den Benutzer, dass ein Aktivierungslink an seine E -Mail gesendet wurde. Die Algorithm ist so etwas wie dieses.# 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
< /code>
Jetzt ist die Herausforderung hier.Imagine einen Senario, den ein Benutzer auf der Website mit einer falschen E -Mail (dh für eine andere Person) registriert. Nach dem Klicken auf den Senden versteht er, dass die E -Mail falsch ist und sich bei der richtigen E -Mail registriert. Wenn der andere Benutzer, dass die erste E -Mail für ihn war, ein Konto erstellen möchte), wenn er oder sie mit dieser E -Mail auf Sumbit klickt, da sich diese E -Mail in der Datenbank befindet und es nicht nur gehandelt wird, wird die Formularvalidierung für eindeutiger E -Mail -Wert genannt, und es wird einen Fehler erfassen, dass ein Konto bereits ein Konto gibt, das in dieser E -Mail -IS -IS -. Link.cleaned_data = super(RegistrationForm, self).clean()
Und sobald ich diesen Teil entfernt habe und einfach die sauberen Daten von selbst wie dieses Cleaned_data = self.cleaned_data verwendete. Einzigartigkeit
Ich habe auch die Funktion Clean_eamil verwendet, um meine eigenen E -Mails speziell zu validieren, aber sie wurde nicht geantwortet, da die saubere Funktion danach aufgerufen wird und meine eigene Validierung nutzlos ist.
Also, was ist die Lösung hier? Danke