Доброй ночи всем, есть проблема с условием в django
У меня есть база данных с таблицей user где хранятся все пользователи. в views.py я написал переменные em в которой хранится введенные данные с html формы и ac1 которая берет данные с таблицы user с фильтром em .Нужно сделать проверку, есть ли введенный имейл в базе данных.
views.py
def main(request):
**em = request.POST['email']
ac1 = User.objects.filter(email_reg=em)
if em == ac1[0]:
logging.critical('my email')
logging.critical(ac1[0])
else:
logging.critical("Woops")**
if 'amirm@fwf.wqe' in ac1:
return render(request, 'registration/regin.html')
else:
a = User(name_reg=request.POST['name'], surname_reg=request.POST['surname'], email_reg=request.POST['email'],
phone_number_reg=request.POST['phone_number'], password=request.POST['password'])
a.save()`введите сюда код`
return render(request, 'registration/main.html')
models.py
class User(models.Model):
class Meta1:
db_table = "User"
name_reg = models.CharField('user name', max_length=15)
surname_reg = models.CharField('user surname', max_length=30)
email_reg = models.CharField('email',max_length=50)
phone_number_reg = models.IntegerField('phone number', max_length=20)
password = models.CharField('password', max_length=10)
def __str__(self):
return self.email_reg
urls.py
app_name = 'registration'
urlpatterns = [
path('', views.ch,name='ch'),
path('login/',views.login,name='login'),
path('regin/',views.regin,name='regin'),
path('main/',views.main,name='main'),
]
regin.html
{% extends 'base.html' %}
{% block title %} login {% endblock %}
{% block content %}
<style>
form {
margin-top:30%;
}
input {
margin-top:10px;
margin-left:35%;
}
button {
margin-top:10px;
margin-left:35%;
}
</style>
<form action="{% url 'registration:main' %}" method="POST">
{% csrf_token %}
<input type="text" required placeholder="Your name" name="name"><br>
<input type="text" required placeholder="Your surname" name="surname"><br>
<input type="email" required placeholder="Enter your email" name="email"><br>
<input type="number" required placeholder="Enter your phone_number" name="phone_number"><br>
<input type="password" required placeholder="Enter your password" name="password"><br>
{% if check == False %}
<a style="margin-left:35%;">Goodbye</a><br>
{% else %}
<a style="margin-left:35%;">Goodbye</a><br>
{% endif %}
<button type="submit">take your profile</button>
</form>
{% endblock %}
У вас "на лицо" неправильная архитектура приложения. Расширение в дальнейшем будет очень непростой задачей.
Предлагаю изменить её следующим образом:
Для создания форм в Django
обычно создают отдельный файл forms.py
в вашем приложении, в котором отдельно описывают каждую форму при помощи класса.
Django
создаст её автоматически на основании модели, которую вы укажете, при этом имеются достаточно гибкие настройки, например указание полей, которые вы будете в ней выводить и много других.
Выглядит это примерно следующим образом:
class UserForm(forms.ModelForm):
class Meta:
model = User
Далее, во views
вы либо создаете эту форму в функции представлении (как это сделано у вас), после чего передаете ее в context
, либо для представления формы есть специальный класс CreateView
, в котором можно указать форму для отображения.
Если говорить про ваш случай, то вы можете в функции создать экземпляр вашей формы (предварительно импортировав)
form = UserForm()
context = {'form' : form}
...
return render(request, 'registration/main.html', context=context)
И для отображения самой формы в templates
, можно написать следующее:
<form action="" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="Submit" />
</form>
При нажатии на кнопку Submit
будет происходить передача заполненных значений формы в функцию представления.
В чем преимущество такого подхода?
При такой архитектуре для ряда задач вы можете предоставить работу валидации полей Django
, в вашем случае можно просто объявить поле e-mail
в вашей модели БД - уникальным:
email_reg = models.CharField('email',max_length=50, unique=True)
(Не забудьте после этого выполнить makemigrations
и migrate
.)
При заполнении полей Django
будет автоматически производить валидацию согласно вашим моделям, и если запись с таким e-mail
уже будет находиться в базе, то такая запись просто не будет добавлена.
Но при этом, при необходимости, всегда есть возможность сделать ручную валидацию либо целый формы, либо отдельных полей.
Если остались вопросы, то советую почитать официальную документацию.