Джанго версии 2.2
У меня есть форма, как показано ниже в forms.py
class NameForm(forms.Form):
email_address = forms.EmailField(label='Your Email Address', max_length=100)
в форме.html
<form method = "POST">
{% csrf_token %}
{{ form }}
<input type = "submit" value = "Submit">
</form>
просмотры.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})
модели.py
class Test(models.Model)
email_address= models.EmailField(max_length=100)
Все соответствующие модули успешно импортированы, и форма отправляется без проблем.
Что мне нужно сделать, так это то, что когда пользователь предоставляет адрес электронной почты с помощью формы, адрес электронной почты должен быть сверен с электронными письмами в базе данных (models.py), которая была предоставлена ранее. После проверки адресов электронной почты в базе данных, если указанный адрес электронной почты соответствует идентификатору электронной почты в базе данных, электронная почта должна быть отправлена на идентификатор электронной почты. Логика проста, но доступ и использование значений form.field в форме представления класса не увенчались успехом.
Я пробовал приведенный ниже код,
testmail = form.cleaned_data['email_address']
if (testmaill == '[email protected]' ):
return HttpResponseRedirect('../success')
И это не сработало
@Alasdair я пытался использовать form.cleaned_data, это не сработало, я пробовал testmail = form.cleaned_data['email_address'] if (testmaill == '[email protected]'): return HttpResponseRedirect('../success '), но он не перенаправлялся на /success, когда я использовал тот же идентификатор почты в базе данных, что и форма ввода, @-Akhilendra я не получаю никаких ошибок, я не могу обработать требование... Я попробовал просмотр функции для форма, но я все еще не могу получить доступ к значению form.filed
я сделал эту печать, она не отображается на отображаемой веб-странице
спасибо @Alasdair, получил это в консоли, но я не могу проверить адрес электронной почты, который я предоставляю, с электронными письмами в базе данных
Не могли бы вы проверить код еще раз, я отредактировал и преобразовал его в функцию
Вы можете сделать проверку в своей форме. См. дополнительную информацию 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})
Для повторения всех писем из вашей базы данных вы можете использовать. for e in Test.objects.all(): print(e.email_address)
. docs.djangoproject.com/en/2.2/ref/models/querysets
я не хочу печатать адрес электронной почты, я хочу проверить его с помощью идентификатора электронной почты, который я предоставляю через формы, могу ли я использовать httpresponseredirect вместо ValidationError
Да, вы можете сделать это в представлениях. Я отредактировал вашу функцию в своем ответе.
Это действительно полезно, получил то, что мне нужно
Пожалуйста, укажите фактическую ошибку, что вы получаете?