@AlexanderLukash

Поля ManyToManyField не сохраняються, что делать?

На сайте есть возможность создания поста к определенной игре. При попытке создать пост он создается но поля ManyToManyField остаються пустыми. Как это поченить?

forms.py
class AddPost(forms.ModelForm):
    title = forms.CharField(label='Title', widget=forms.TextInput(attrs={'placeholder': 'Заголовок...'}),
                            help_text='Максимум 100 символів.')
    games = forms.ModelChoiceField(queryset=Game.objects.filter(draft=False), widget=forms.Select, required=True)
    tags = forms.ModelMultipleChoiceField(queryset=Tags.objects.all(), widget=forms.SelectMultiple(
        attrs={'style': "padding: 10px; background:#edf2ff; border:none;"}))
    foreword_description = forms.CharField(label='Small Description',
                                           widget=forms.Textarea(attrs={'placeholder': 'Коротке описання...'}),
                                           help_text='Максимум 335 символів.')
    description = forms.CharField(label='Description', widget=CKEditorUploadingWidget())
    rank = forms.FloatField(label='Rank', widget=forms.TextInput(attrs={'placeholder': 'Оцінка...'}))
    good = forms.ModelChoiceField(queryset=Good.objects.all(), widget=forms.Select(
        attrs={'style': "padding: 10px; background:#edf2ff; border:none;"}))
    bad = forms.ModelChoiceField(queryset=Bad.objects.all(), widget=forms.Select(
        attrs={'style': "padding: 10px; background:#edf2ff; border:none;"}))
    url = forms.SlugField(label='Title', widget=forms.TextInput(attrs={'placeholder': 'Унікальний ідентифікатор...'}),
                          help_text='Максимум 255 символів.')
    premiere = forms.DateField(label='Date', widget=forms.SelectDateWidget(attrs=({'style': 'width: 10%; display: inline-block;'})),
                               help_text='У форматі: 24.03.2022.')

    class Meta:
        model = Post
        fields = (
            'title', 'games', 'tags', "foreword_description", "description", "rank", "good", "bad", "url", "premiere",)


views.py
def addpost(request):
    if request.method == "POST":
        form = AddPost(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.save()

            return redirect('../blogs/')
    else:
        form = AddPost()

    data = {
        'form': form,
        'add': True
    }

    return render(request, 'gamelibs/user-post-manager.html', {'form': form})


models.py
spoiler
class Game(models.Model):
    title = models.CharField("Назва", max_length=100)
    tagline = models.CharField("Слоган", max_length=500, default='')
    description = models.TextField("Описання")
    description_small = models.CharField("Описання коротко", max_length=100, null=True)
    poster = models.ImageField("Постер", upload_to="games/poster/")
    banner = models.ImageField("Банер", upload_to="games/banner/", null=True)
    treiler = models.CharField("Трейлер", max_length=500, null=True)
    treiler_img = models.ImageField("Інтро терейлеру", upload_to="games/intro/", null=True)
    country = models.CharField("Країна", max_length=30)
    company = models.ManyToManyField(Company, verbose_name="Компанія", related_name="company_game")
    ganres = models.ManyToManyField(Ganre, verbose_name="Жанри")
    price = models.FloatField("Ціна", help_text="У форматі 10.00", max_length=100)
    sale_price = models.IntegerField('Скидка в процентах', blank=True, default=0)
    world_premiere = models.DateField("Дата виходу", default=date.today)
    budget = models.PositiveIntegerField("Бюджет", default=0, help_text="вказуйте сумму в доларах.")
    category = models.ManyToManyField(Category, verbose_name="Категорія")
    url = models.SlugField(max_length=255, unique=True)
    os = models.CharField("Операційні системи", max_length=100)
    processor = models.CharField("Процесор", max_length=100)
    memory = models.CharField("Операційна памьять", max_length=100)
    graphics = models.CharField("Відеокарта", max_length=100)
    hard_drive = models.CharField("Місце на диску", max_length=100)
    hit_count_generic = GenericRelation(HitCount, object_id_field='object_pk',
                                        related_query_name='hit_count_generic_relation', default=0)
    draft = models.BooleanField("Чернетка", default=False)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse("game_details", kwargs={"slug": self.url})

    def get_sale(self):
        if self.sale_price == 100:
            return 'FREE'
        elif self.sale_price == 0:
            return f'{self.price}'
        else:
            price = float(self.price * (100 - self.sale_price) / 100)
            x = float('{:.2f}'.format(price))
            return x

    class Meta:
        verbose_name = "Гра"
        verbose_name_plural = "Ігри"

class Tags(models.Model):
    title = models.CharField("Заголовок", max_length=100)
    url = models.SlugField(max_length=160, unique=True)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse("tag_filter", kwargs={"slug": self.url})

    class Meta:
        verbose_name = "Тег"
        verbose_name_plural = "Теги"


class Good(models.Model):
    title = models.CharField("Заголовок", max_length=100)
    url = models.SlugField(max_length=160, unique=True)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse("good_blog_filter", kwargs={"slug": self.url})

    class Meta:
        verbose_name = "Позитив"
        verbose_name_plural = "Позитивні"


class Bad(models.Model):
    title = models.CharField("Заголовок", max_length=100)
    url = models.SlugField(max_length=160, unique=True)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse("bad_blog_filter", kwargs={"slug": self.url})

    class Meta:
        verbose_name = "Негатив"
        verbose_name_plural = "Негативні"

class Post(models.Model):
    title = models.CharField("Заголовок", max_length=100)
    games = models.ManyToManyField(Game, verbose_name="Вкажіть гру", help_text="Вказати тільки одну гру!",
                                   related_name='games')
    tags = models.ManyToManyField(Tags, verbose_name="Теги", help_text="Вказати тільки 4 тега!")
    foreword_description = models.TextField("Передмова", max_length=335)
    description = models.TextField("Описання")
    rank = models.FloatField("Оцінка", default=0, help_text="Від 1 до 10")
    good = models.ManyToManyField(Good, verbose_name="Позитивні речі", help_text="Максимальна кількість 4")
    bad = models.ManyToManyField(Bad, verbose_name="Негативні речі", help_text="Максимальна кількість 4")
    premiere = models.DateField("Дата публікації", default=date.today)
    url = models.SlugField(max_length=255, unique=True, default="Введіть унікальний аудентифікатор")
    hit_count_generic = GenericRelation(HitCount, object_id_field='object_pk',
                                        related_query_name='hit_count_generic_relation')
    draft = models.BooleanField("Чернетка", default=False)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse("post_details", kwargs={"slug": self.url})

    class Meta:
        verbose_name = "Пост"
        verbose_name_plural = "Пости"


Буду очень благодарен за ваши ответы.
  • Вопрос задан
  • 70 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы