Поле формы по умолчанию django
Делаю регистрацию django. Столкнулся с проблемой, нужно чтоб поле username было скрыто и равнялось полю email, а не вводилось пользователем.
views.py
from django.shortcuts import render
from mainApp.forms import Register
from django.views.generic.edit import FormView
def home(request):
return render(request, 'home.html')
# Вариант регистрации на базе класса FormView
class MyRegisterFormView(FormView):
# Указажем какую форму мы будем использовать для регистрации наших пользователей, в нашем случае
# это UserCreationForm - стандартный класс Django унаследованный
form_class = Register
# Ссылка, на которую будет перенаправляться пользователь в случае успешной регистрации.
success_url = "/accounts/login/"
# Шаблон, который будет использоваться при отображении представления.
template_name = "registration/register.html"
def form_valid(self, form):
form.save()
return super(MyRegisterFormView, self).form_valid(form)
def form_invalid(self, form):
return super(MyRegisterFormView, self).form_invalid(form)
forms.py
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
class Register(UserCreationForm):
def clean_email(self):
super().clean()
email = self.cleaned_data.get("email")
if User.objects.filter(email=email).exists():
msg = "Этот адресс уже зарегестрирован."
self.add_error('email', msg)
return email
class Meta:
model = User
fields = ['username', 'email', 'password1', 'password2']
Ответы (1 шт):
Автор решения: Andrey Maslov
→ Ссылка
Лучшим вариантом будет использовать свою модель для пользователя, как указали в комментарии, если хочется обойтись тем, что есть сейчас, то я бы сделал так прятал бы поле e-mail, а не username, так как username обязательно для ввода, а e-mail нет и при проверке данных формы ставил бы email = username. как-то так:
class Register(UserCreationForm):
class Meta:
model = User
fields = ['username', 'email', 'password1', 'password2']
widgets = {
"email": forms.HiddenInput() # прячем поле e-mail
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields["username"].label = "e-mail" #будем отображать поле на странице как e-mail
def clean_(self):
cleaned_data = super().clean()
email = self.cleaned_data.get("username")
if email:
if User.objects.filter(email=email).exists():
self.add_error('username', "Этот адрес уже зарегестрирован.")
else:
cleaned_data["email"] = email
return cleaned_data