Форма не заполняет поля в БД
Даже не знаю с чего начать. Есть модель, которая хранит инфу про игру, пытался я сделать так чтобы автор автоматом задавался как зарегистрированный пользователь. Ну получилось, но поломался логин. Пришлось создавать новый проект и переносить весь код в новый. Код перенес весь. Проверял через гит. Но теперь нельзя добавить новую игру.
forms.py
from django.contrib.auth.forms import UserCreationForm
from django.core import validators
from django.forms import *
from .models import *
class AddGameForm(ModelForm):
banner = ImageField(label='Баннер',
validators=[
validators.FileExtensionValidator(
allowed_extensions=('gif', 'jpg', 'png')
)
],
error_messages=({'invalid_extension': 'Этот формат файлов не поддерживается'})
)
torrent = FileField(label="Торрент с игрой",
validators=[
validators.FileExtensionValidator(
allowed_extensions=('torrent',)
)
],
error_messages=({'invalid_extension': "Извини, поддерживаем только торренты"})
)
class Meta:
model = Game
fields = ('name', 'description', 'genre', 'banner', 'torrent')
class AddUserForm(UserCreationForm):
def __init__(self, *args, **kwargs):
super(AddUserForm, self).__init__(*args, **kwargs)
email = EmailField(
widget=EmailInput(
attrs={
'placeholder': 'fsociety@fuxsocy.com'
}
)
)
username = CharField(
widget=TextInput(),
label="Ник"
)
password1 = CharField(
label="Пароль",
strip=False,
widget=PasswordInput(attrs={"autocomplete": "new-password"}),
)
password2 = CharField(
label="Ещё раз",
strip=False,
widget=PasswordInput(attrs={"autocomplete": "new-password"}),
)
class Meta:
model = CustomUser
fields = ['email', 'username', 'password1', 'password2']
models.py
from django.db import models
from django.contrib.auth.models import PermissionsMixin, AbstractBaseUser, BaseUserManager
class Genre(models.Model):
name = models.CharField(verbose_name="имя",
max_length=50
)
def __str__(self):
return self.name
class Meta:
verbose_name_plural = "Жанры"
verbose_name = "Жанр"
class Game(models.Model):
author = models.ForeignKey('CustomUser',
on_delete=models.DO_NOTHING,
verbose_name="пользователь",
default=None
)
name = models.CharField(verbose_name="имя",
max_length=50
)
description = models.TextField(verbose_name="описание")
date_on_store = models.DateTimeField(auto_now=True,
verbose_name="дата появления на магазине"
)
genre = models.ManyToManyField(Genre,
verbose_name="жанр",
)
banner = models.ImageField(verbose_name='баннер',
upload_to='img/'
)
torrent = models.FileField(verbose_name="торрент",
upload_to='torrents/',
default="null"
)
def __str__(self):
return self.name
class Meta:
ordering = ['date_on_store']
verbose_name = "Игра"
verbose_name_plural = "Игры"
class CustomUserManager(BaseUserManager):
def create_user(self, email, username, password):
user = self.model(email=email, username=username, password=password)
user.set_password(password)
user.is_staff = False
user.is_superuser = False
user.save(using=self._db)
return user
def create_superuser(self, email, username, password):
user = self.model(email=email, username=username, password=password)
user.set_password(password)
user.is_staff = True
user.is_superuser = True
user.save(using=self._db)
return user
def get_by_natural_key(self, username_):
print(username_)
return self.get(username=username_)
class CustomUser(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(verbose_name='Email',
unique=True,
)
username = models.CharField(verbose_name='ник',
unique=True,
max_length=30,
)
color = models.CharField(verbose_name='цвет',
max_length=30,
default='gray',
)
is_staff = models.BooleanField(default=False)
objects = CustomUserManager()
REQUIRED_FIELDS = ['email', ]
USERNAME_FIELD = 'username'
def get_short_name(self):
return self.username
def natural_key(self):
return self.email
def __str__(self):
return self.username
class Comment(models.Model):
text = models.TextField(verbose_name="текст комментария")
date = models.DateTimeField(auto_now=True,
verbose_name="дата публикации"
)
response = models.ForeignKey('Comment',
verbose_name="на какой отвечает",
default=None,
on_delete=models.CASCADE,
)
author = models.OneToOneField('CustomUser',
on_delete=models.CASCADE,
verbose_name="автор")
views.py
def add_game(request):
form = AddGameForm()
context = {
'all_genres': all_genres,
'form': form,
}
if request.user.is_authenticated:
if request.method == "POST":
if not form.is_valid():
new_game = form.save(commit=False)
new_game.author = request.user
new_game.save()
return redirect('/games/')
else:
print('form is invalid')
return render(request, 'mainapp/add_game.html', context)
else:
return render(request, 'registration/sign_up.html', context)
В views.py начудил с if not valid в целях отладки, чтобы сохранило несмотря ни на что. Вот так я и выявил эту проблему
Так у тебя данных нет в форме. Форма отправляется на сервер в виде POST запроса.
if request.method == "POST":
form = AddGameForm(request.POST) <-- Ты должен заполнить свою форму данными из POST
if form.is_valid():
....
И если данные будут валидными, все сохранится.
Человеческая невнимательность. Форма не передавала данные из-за того, что я забыл добавить в вызов конструктора объекта формы request.FILES