Как получить значения полей формы в форме и отправить почту

#django #forms #web-applications #view #django-class-based-views

#django #формы #веб-приложения #Вид #django-представления на основе классов

Вопрос:

Django версии 2.2

У меня есть форма, как показано ниже в forms.py

 class NameForm(forms.Form):
    email_address = forms.EmailField(label='Your Email Address', max_length=100)

  

в form.html

 <form  method="POST">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit">
</form>

  

views.py

 def register(request):
    model = Test
    if request.method == 'POST':  # If the form has been submitted...
        form = NameForm(request.POST)  # A form bound to the POST data
        if form.is_valid():  # All validation rules pass

            email_address = form.cleaned_data['email_address']
            print (email_address)
            if (email_address == Test.email_address):

                return HttpResponseRedirect('../success') # Redirect after POST
            else :
                return HttpResponseRedirect('../failed')
    else:
        form = NameForm()  # An unbound form

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

models.py

 class Test(models.Model)
email_address= models.EmailField(max_length=100)

  

Все соответствующие модули успешно импортированы, и форма отправляется без каких-либо проблем.

Что мне нужно сделать, так это то, что когда пользователь указывает адрес электронной почты с помощью формы, адрес электронной почты должен быть сверен с электронными письмами в базе данных (модели.py), который был предоставлен ранее. После проверки с помощью адресов электронной почты в базе данных, если указанный адрес электронной почты совпадает с идентификатором электронной почты в базе данных, электронное письмо должно быть отправлено на идентификатор электронной почты . Логика проста, но не удалось получить доступ к значениям form.field и использовать их в форме представления класса.

Я попробовал приведенный ниже код ,

 testmail = form.cleaned_data['email_address']
if (testmaill == 'mymail@database.com' ): 
  return HttpResponseRedirect('../success') 
  

И это не сработало

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

1. Пожалуйста, укажите фактическую ошибку, что вы получаете?

2. @Alasdair я пытался использовать form.cleaned_data , это не сработало, я попробовал testmail = form.cleaned_data[’email_address’] if (testmaill == ‘mymail@database.com ‘ ): возвращает HttpResponseRedirect(‘../success’), но он не перенаправлял на /success, когда я использовал ту же почтуидентификатор в базе данных в качестве ввода формы, @-Akhilendra я не получаю никаких ошибок, я не могу обработать требование… Я попробовал просмотр функции для формы, но все равно не могу получить доступ к значению form.filed

3. я выполнил эту печать, она не отображается на отображаемой веб-странице

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

5. Не могли бы вы еще раз проверить код, я отредактировал и преобразовал его в функцию

Ответ №1:

Вы можете выполнить проверку в своей форме. Подробнее https://docs.djangoproject.com/en/2.2/ref/forms/validation /.

Пример:

 def clean_email_address(self):
        email_address = self.cleaned_data.get('email_address')
        if Test.objects.filter(email_address__iexact=email_address).count() == 0:
            raise forms.ValidationError("Your email address not exist")

        return email_address
  

И затем, по вашему мнению, если форма действительна, вы можете получить адрес электронной почты:

  form.cleaned_data.get("email_address")
  

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

 form.data.get("email_address")
  

Вот ваша отредактированная функция:

 def register(request):
    if request.method == 'POST':  # If the form has been submitted...
        form = NameForm(request.POST)  # A form bound to the POST data
        if form.is_valid():  # All validation rules pass

            email_address = form.cleaned_data.get('email_address')
            if Test.objects.filter(email_address__iexact=email_address).count() == 0:

                return HttpResponseRedirect('../success') # Redirect after POST
            else :
                return HttpResponseRedirect('../failed')
    else:
        form = NameForm()  # An unbound form

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

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

1. Для перебора всех электронных писем из вашей базы данных вы можете использовать. for e in Test.objects.all(): print(e.email_address) . docs.djangoproject.com/en/2.2/ref/models/querysets

2. я не хочу печатать адрес электронной почты, я хочу проверить его с помощью идентификатора электронной почты, который я предоставляю через формы, могу ли я использовать httpresponseredirect вместо ValidationError

3. Да, вы можете сделать это в представлениях. Я отредактировал вашу функцию в своем ответе.

4. Это действительно полезно, получил то, что мне было нужно