Django TypeError at /signup/ 'in <string>' требует строку в качестве левого операнда, а не список

У меня есть форма регистрации, которая проверяет, содержит ли поле электронной почты gmail, и выдает ошибку, если нет.

forms.py

def clean_email(self):
    submitted_data = self.cleaned_data['email']
    if '@gmail.com' not in submitted_data:
        raise forms.ValidationError('You must register using a gmail address')

views.py

class SignUpView(View):
form_class = SignUpForm
template_name = 'user/register.html'

def get(self, request, *args, **kwargs):
    form = self.form_class()
    return render(request, self.template_name, {'form': form})

def post(self, request, *args, **kwargs):
    form = self.form_class(request.POST)
    if form.is_valid():

        user = form.save(commit=False)
        user.is_active = False # Deactivate account till it is confirmed
        user.save()

        current_site = get_current_site(request)
        subject = 'Activate Your Account'
        message = render_to_string('user/account_activation_email.html', {
            'user': user,
            'domain': current_site.domain,
            'uid': urlsafe_base64_encode(force_bytes(user.pk)),
            'token': account_activation_token.make_token(user),
        })
        user.email_user(subject, message)

        return redirect('confirm_registration')

    return render(request, self.template_name, {'form': form})

Я хочу добавить несколько других "доверенных адресов электронной почты", чтобы форма позволяла пользователям регистрироваться, например: @yahoo.com, @outlook.com, но я не могу добавить список или кортеж, потому что получаю ошибку:

TypeError at /signup/
'in <string>' requires string as left operand, not tuple

Вопрос. Как я могу создать список доверенных почтовых доменов и вместо '@gmail.com' поместить список почтовых доменов?

Судя по ошибке, похоже, что вы пытаетесь сделать что-то вроде: if ['a', 'b'] in 'string'? Я полагаю, что in может только проверить, находится ли один элемент слева в итераторе справа. Поэтому для того, чтобы это сработало, вы должны иметь один элемент слева от вашего in, а не список.

Вы пробовали что-то подобное?

if not any(['@gmail.com', '@otheremail.com'] in submitted_data):
    raise YourError

Вы можете составить list из доверенных почтовых сервисов и проверить, содержит ли ваш submitted_data т.е. email в вашем случае какой-либо из почтовых сервисов. Вы можете попробовать это.

def clean_email(self):
    submitted_data = self.cleaned_data['email']
    trusted_email_services = ["@gmail.com", "@yahoo.com", "@outlook.com"]
    if not any(email_service in submitted_data for email_service in trusted_email_services)
        raise forms.ValidationError('You must register using a gmail or yahoo or outlook address')
Вернуться на верх