Я использую Python 3.9.4 и Django 3.2, и я создал функцию и форму, чтобы проверить, существует ли имя пользователя или адрес электронной почты

#python #django

Вопрос:

Я получаю сообщение об ошибке индексы кортежей должны быть целыми числами или срезами, а не пользователь также индексы кортежей должны быть целыми числами или срезами, а не нетипом Я проверяю, существует ли какое-либо из этих имен пользователя или электронной почты или нет, также существует() не работает только первый() не работает примечание Я использую python 3.9.4

 if User.objects.filter(username=username).exists() or User.objects.filter(email=email).exists():
    error_message = ''
    email_error = ('', 'Email is taken. ')[User.objects.filter(email=email).exists()]
    username_error = ('', 'Username is taken. ')[User.objects.filter(username=username).exists()]
    error_message = email_error   username_error
    messages.success(request, error_message)
    return redirect('/register/')
 

Комментарии:

1. С чем ты пытаешься это сделать email_error = ('', 'Email is taken. ')[User.objects.... ? Это причина ошибки, потому что вы пытаетесь срезать кортеж по набору запросов

2. Вы хотите проверить поле имени пользователя в представлении регистрации?

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

4. Нет, я хочу проверить, существует имя пользователя или адрес электронной почты или нет, и отобразить сообщение

Ответ №1:

В этой строке

 email_error = ('', 'Email is taken. ')[User.objects.filter(email=email).exists()]
 

вы создаете кортеж с частью ('', 'Email is taken. ') . Затем вы пытаетесь получить значение определенного индекса для этого кортежа, используя третьи скобки [ ] . Однако вы передаете логическое значение, пытаясь получить доступ к значению, хранящемуся в индексе этого кортежа.

Мне кажется, что у вас есть некоторая путаница в отношении кортежей или того, что это ('', 'Email is taken. ') на самом деле делает.

Возможное решение для этого: Обратите внимание, что это мой способ решения этой проблемы, и это может отличаться от людей к людям.

 is_duplicate_username = User.objects.filter(username=username).exists()
is_duplicate_email = User.objects.filter(email=email).exists()
if is_duplicate_username or is_duplicate_email:
    error_message = ''
    error_message = error_message   'Email is taken' if is_duplicate_email else error_message
    error_message = error_message   'Username is taken' if is_duplicate_username else error_message
    messages.success(request, error_message)
    return redirect('/register/')