Ошибка 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})