Ошибка django повторяющееся значение ключа нарушает ограничение уникальности

Всем привет. Делаю сайт, конкретно форму добавления постов. При попытке сохранить пост появляется вот такая ошибка:

IntegrityError at /form ОШИБКА: повторяющееся значение ключа нарушает ограничение уникальности "sitelogic_post_post_slug_key" DETAIL: Ключ "(post_slug)=()" уже существует.

База данных - PostgreSQL

Пожалуйста, помогите разобраться в чем проблема. Искал ответ в большом количестве источников, нигде не нашел решения

Models.py:

class Post(models.Model):
    post_title = models.CharField(max_length=250, verbose_name='Заголовок')
    post_slug = models.SlugField(max_length=250, unique=True, verbose_name='URL')
    post_content = models.TextField(max_length=450000, verbose_name='Содержание')
    post_time_create = models.DateTimeField(auto_now_add=True, verbose_name='Время создания')
    post_time_update = models.DateTimeField(auto_now=True, verbose_name='Время обновления')
    post_media = models.ImageField(upload_to='%Y/%m/%d/', default='default.png', blank=True, verbose_name='Медиа')
    cat = models.ForeignKey('PostCategory', on_delete=models.PROTECT, null=True, verbose_name='Категория')

    def __str__(self):
        return self.post_title

    def get_absolute_url(self):
        return reverse('show_post', kwargs={'post_title_slug': self.post_title, 'post_id_slug': self.id})

    class Meta:
        verbose_name = 'Пост'
        verbose_name_plural = 'Посты'

        ordering = ['post_title', 'post_content']

class PostCategory(models.Model):
    category_name = models.CharField(max_length=100, db_index=True)
    slug = models.SlugField(max_length=100, unique=True, verbose_name='URL')

    class Meta:
        verbose_name = 'Категория'
        verbose_name_plural = 'Категории'

        ordering = ['pk']

    def __str__(self):
        return self.category_name

    def get_absolute_url(self):
        return reverse('cat_posts', kwargs={'cat_slug': self.slug})

Forms.py:

class PostForm(forms.ModelForm):
captcha = CaptchaField()

class Meta:
    model = Post
    fields = ['post_title', 'post_content', 'post_media', 'cat']

def clean_post_title(self):
    post_title = self.cleaned_data['post_title']
    if len(post_title) >= 250:
        raise ValidationError('Длина превышает 200 символов')

    return post_title

Views.py:

class FormAdd(View):

    def get(self, request):
        form = PostForm
        return render(request, 'sitelogic/addpost.html', context={'form': form})

    def post(self, request):
        request_keep = PostForm(request.POST)
        if request_keep.is_valid():
            request_keep.save()
            return redirect('home_page')
        return render(request, 'sitelogic/addpost.html', context={'form': request_keep})

Urls.py:

urlpatterns = [
              path('', homepage, name='home_page'),
              path('about', About.as_view(), name='about_site'),
              path('post/<slug:post_title_slug>/<int:post_id_slug>/', ShowPost, name='show_post'),
              path('forums/<slug:cat_slug>', ShowCategory.as_view(), name='cat_posts'),
              path('form', FormAdd.as_view(), name='add_post'),
              path('cabinet', Cabinet.as_view(), name='cabinet'),
              path('auth/', include('djoser.urls')),
              path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
              path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
              path('api/token/verify/', TokenVerifyView.as_view(), name='token_verify'),
              path('testapi', Base.as_view())
          ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) \
          + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Addpost.html:

{% extends 'sitelogic/base.html' %}

{% block body %}
<form action="{% url 'add_post' %}" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">добавить</button>
</form>
{% endblock %}

У тебя есть обязательные поля, которые ты не отображаешь в форме. Тебе надо либо их выводить в форму и заполнять вручную, либо заполнять программно в функции post(self, request) как-то так:

def post(self, request, *args, **kwargs):
    request_keep = PostForm(request.POST)
    if request_keep.is_valid():
        request_keep.save(commit=False)
        request_keep.post_slug = "some value"
        request_keep.post_time_create = "some value"
        request_keep.post_time_update = "some value"
        request_keep.save()
        return redirect('home_page')
    return render(request, 'sitelogic/addpost.html', context={'form': request_keep})


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