#python #django #python-2.7 #django-models #django-forms
#python #django #python-2.7 #django-модели #django-forms
Вопрос:
Я только начал разрабатывать с Django, и у меня возникла небольшая проблема с использованием формы, которую я создал.
В настоящее время у меня есть модель с именем SignUp, которая позволяет пользователям «регистрироваться» на сайте, вводя свои имя и фамилию и адрес электронной почты.
Функция, которую я пытаюсь реализовать, удаляет пользователя, который уже зарегистрирован пользователем, отправляющим адрес электронной почты, с которым он зарегистрировался.
У меня настроена форма, представляющая собой простое поле электронной почты, но я не могу понять, как заставить мое представление сопоставить форму с пользователем, а затем успешно удалить пользователя из базы данных.
Вот код для формы:
class DeleteUserForm(forms.Form):
email_address = forms.EmailField()
И вот код для представления:
class DeleteUserView(generic.edit.FormView):
template_name = 'signups/delete_user_form.html'
form_class = DeleteUserForm
success_url = '/users/delete/success/'
def form_valid(self, form):
for user in SignUp.objects.all():
if user.email == form: # The email attribute holds the user's
user.delete() # email address and the form should be
# the address the user submitted to be
# deleted?
return redirect(self.success_url)
return redirect('/users/delete/failure/')
Каждый раз, когда я пытаюсь отправить адрес электронной почты, я не получаю совпадения, ни один пользователь не удаляется, и я просто перенаправляюсь в свой каталог сбоев.
У кого-нибудь есть представление о том, что происходит? Спасибо
Ответ №1:
Используя логику Камиля, я переписал поиск по полю, и этот код работает:
duplicates = SignUp.objects.filter(email__iexact=form.cleaned_data['email_address'])
if duplicates:
duplicates.delete()
return redirect(self.success_url)
Но кто-нибудь знает, почему код, который я использовал раньше, не работал?
Комментарии:
1. Это не сработало, потому что вы сравнивали строковый объект (адрес электронной почты) с экземпляром формы django. Это сработало бы, если бы вы заменили user.email == form на user.email == form.cleaned_data[’email’], но приведенное выше решение намного чище.
Ответ №2:
Самое простое решение:
duplicates = SignUp.objects.filter(email=form.cleaned_data['email_address'])
if duplicates:
duplicates.delete()
return redirect(self.success_url)
return redirect('/users/delete/failure/')
Правильно, исправлен поиск отношений.
Комментарии:
1. Я думаю, вы перепутали параметры поиска полей с чем-то другим, но изменение его на «duplicates = SignUp.objects.filter(email__iexact=form.cleaned_data[’email_address’])» сработало с вашей логикой (я использовал iexact в качестве типа поиска, поэтому адрес может быть нечувствительным к регистру). Спасибо.
Ответ №3:
Вы можете получить доступ к значениям полей через form.cleaned_data
словарь:
if user.email == form.cleaned_data['email_address']: