Форма не заполняет поля в БД

Даже не знаю с чего начать. Есть модель, которая хранит инфу про игру, пытался я сделать так чтобы автор автоматом задавался как зарегистрированный пользователь. Ну получилось, но поломался логин. Пришлось создавать новый проект и переносить весь код в новый. Код перенес весь. Проверял через гит. Но теперь нельзя добавить новую игру.

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

Вернуться на верх