Создаю форму выбора пола и подписки
Добавляю в форму пользователя: выбор пола и согласие на подписку. Выдает ошибку:
OperationalError at / no such column: users_profile.mails
и в терминале
TypeError: init() got an unexpected keyword argument 'choices'
Где я вывожу код не верно?
forms.py
from django import forms
from django.contrib.auth.models import User
from .models import Profile
from django.contrib.auth.forms import UserCreationForm
class UserRegisterForm(UserCreationForm):
email = forms.EmailField(
label='Введите Email',
required=True,
widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Введите Email'})
)
username = forms.CharField(
label='Введите логин',
required=True,
help_text='Нельзя вводить символы: @, /, _',
widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Введите логин'})
)
# some = forms.ModelChoiceField(queryset=User.objects.all())
password1 = forms.CharField(
label='Введите пароль',
required=True,
help_text='Пароль не должен быть маленьким и простым',
widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Введите пароль'})
)
password2 = forms.CharField(
label='Подтвердите пароль',
required=True,
widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Повторно введите пароль'})
)
class Meta:
model = User
fields = ['username', 'email', 'password1', 'password2']
class UserUpdateForm(forms.ModelForm):
email = forms.EmailField(
label='Введите Email',
required=True,
widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Введите Email'})
)
username = forms.CharField(
label='Введите логин',
required=True,
help_text='Нельзя вводить символы: @, /, _',
widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Введите логин'})
)
class Meta:
model = User
fields = ['username', 'email']
CHOICES = (('male', 'Мужской пол'),('female', 'Женский пол'))
class ProfileImageForm(forms.ModelForm):
img = forms.ImageField(
label='Загрузить фото',
required=False,
widget=forms.FileInput
)
sex = forms.CharField(choices=CHOICES, default="Мужской пол", max_length=40)
mails = forms.BooleanField(default=True)
class Meta:
model = Profile
fields = ['img', 'sex', 'mails']
models.py
from django.db import models
from django.contrib.auth.models import User
from PIL import Image
CHOICES = (('male', 'Мужской пол'),('female', 'Женский пол'))
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
img = models.ImageField('Фото пользователя', default='default.png', upload_to='user_images')
# Создаем новые поля в самой таблице
# Первое поле будет с галочкой, поэтому используем класс BooleanField
mails = models.BooleanField(default=True)
# Второе поле будет как выпадающий список, поэтому используем CharField
# и в него помещаем список вариантов - choices
sex = models.CharField(choices=CHOICES, default="Мужской пол", max_length=40)
def __str__(self):
return f'Профайл пользователя {self.user.username}'
def save(self, *args, **kwargs):
super().save()
image = Image.open(self.img.path)
if image.height > 256 or image.width > 256:
resize = (256, 256)
image.thumbnail(resize)
image.save(self.img.path)
class Meta:
verbose_name = 'Профайл'
verbose_name_plural = 'Профайлы'
views.py
from django.shortcuts import render, redirect
# from django.contrib.auth.forms import UserCreationForm
from .forms import UserRegisterForm, ProfileImageForm, UserUpdateForm
from django.contrib import messages
from django.contrib.auth.decorators import login_required
def register(request):
if request.method == "POST":
form = UserRegisterForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
messages.success(request, f'Пользовать {username} был успешно создан!')
return redirect('home')
else:
form = UserRegisterForm()
return render(
request,
'users/registration.html',
{
'title': 'Страница регистрации',
'form': form
}
)
@login_required
def profile(request):
if request.method == "POST":
profileForm = ProfileImageForm(request.POST, request.FILES, instance=request.user.profile)
updateUserForm = UserUpdateForm(request.POST, instance=request.user)
if profileForm.is_valid() and updateUserForm.is_valid():
updateUserForm.save()
profileForm.save()
messages.success(request, f'Ваш аккаунт был успешно обновлен!')
return redirect('profile')
else:
profileForm = ProfileImageForm(instance=request.user.profile)
updateUserForm = UserUpdateForm(instance=request.user)
data = {
'profileForm': profileForm,
'updateUserForm': updateUserForm
}
return render(request, 'users/profile.html', data)