Проблемы с формами Django

#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']: