Django: проверьте, присутствует ли обновленное поле в базе данных - PullRequest
0 голосов
/ 11 ноября 2019

Я пытаюсь обновить django ModelForm, указав адрес электронной почты в качестве поля. В форме создания я проверяю, присутствует ли поле в базе данных, если это так, выдается ошибка проверки. Эта часть работает, как и ожидалось.

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

forms.py

class MyObjCreateForm(forms.ModelForm):
    first_name = forms.CharField(max_length=50, label='First name')
    last_name = forms.CharField(max_length=50, label='Last name')
    email = forms.EmailField(label='Email')
    location = forms.ChoiceField(choices=TP_TM_Location, label='Location')
    designation = forms.ChoiceField(choices=TP_TM_Designation, label='Designation')
    date_of_joining = forms.DateField(label='Date of joining',
                                    widget=forms.TextInput(attrs={'type': 'date'}),
                                    initial=date.today())
    username = forms.CharField(label='Login username')
    password = forms.CharField(widget=forms.PasswordInput(), label='Login password')
    current_status = forms.ChoiceField(choices=TP_Status, label='Current status')

    def clean_email(self):
        email = self.cleaned_data.get('email')
        try:
            match = MyObj.objects.get(email=email)
            raise forms.ValidationError("email already exists in system. Please check the existing list.")
        except MyObj.DoesNotExist:
            return email

class MyObjUpdateForm(forms.ModelForm):
    first_name = forms.CharField(max_length=50, label='First name')
    last_name = forms.CharField(max_length=50, label='Last name')
    email = forms.EmailField(label='Email')
    location = forms.ChoiceField(choices=TP_TM_Location, label='Location')
    designation = forms.ChoiceField(choices=TP_TM_Designation, label='Designation')
    date_of_joining = forms.DateField(label='Date of joining',
                                    widget=forms.TextInput(attrs={'type': 'date'}),
                                    initial=date.today())
    current_status = forms.ChoiceField(choices=TP_Status, label='Current status')
    username = forms.CharField(label='Login username')

    def clean_email(self):
        email = self.cleaned_data.get('email')
        try:
            match = MyObj.objects.get(email=email)
            raise forms.ValidationError("email already exists in system. Please check the existing list.")
        except MyObj.DoesNotExist:
            return email

Спасибо,

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

Вам необходимо удалить проверку в классе обновлений. Вы можете просто вернуть письмо без проверки.

def clean_email(self):
    return self.cleaned_data.get('email')

Однако, если вы хотите проверить, есть ли у пользователя новое письмо, вы можете использовать следующий метод проверки:

def clean_email(self):
    email = self.cleaned_data.get('email')
    if self.instance.email == email:
        raise forms.ValidationError("Email already present.")
    return email
0 голосов
/ 11 ноября 2019

Для этого вам необходимо исключить текущего пользователя из набора запросов, как это.

    def clean_email(self):
        email = self.cleaned_data.get('email')
        email_match = MyObj.objects.filter(email=email).exclude(pk=self.instance.pk)  
        if self.instance and self.instance.pk and not email_match:
            return email
        else:
            raise forms.ValidationError("email already exists in system. Please check the existing list.")  
...