Когда я пытаюсь создать запись в блоге, отображается not null constraint failed: blog_blog.id
когда я пытаюсь создать запись в блоге показывает not null constraint failed: blog_blog.id и я перепробовал все возможные способы исправить это и все равно не работает я не знаю должен ли я добавить поле id в мой models.py позвольте мне показать мой код
models.py
# some field are commented out because i was trying them to see if it would work
class Blog(models.Model):
id = models.UUIDField(primary_key=True, editable=False)
title = models.CharField(max_length=10000, null=True, blank=True, verbose_name="Title")
content = models.TextField(verbose_name="Post Content")
# slug = models.SlugField(unique=True)
image = models.ImageField(upload_to="blog-images/%Y/%m/%d/", verbose_name="Post Thumbnail")
category = models.ForeignKey(Category, on_delete=models.DO_NOTHING, verbose_name="Category", null=True)
tags = models.ManyToManyField(Tag, related_name='tags', verbose_name="Tag")
status = models.CharField(choices=STATUS_CHOICE, default="published", max_length=150, verbose_name='Status')
creator = models.ForeignKey(User, on_delete=models.DO_NOTHING, verbose_name="Creator", null=True)
created = models.DateTimeField(auto_now_add=True ,verbose_name="Created", null=True)
def get_absolute_url(self):
# return reverse('blog:blog-details', args=[self.slug])
return reverse('blog:blog-details', kwargs={'pk': self.pk})
class Meta:
verbose_name = "Blog Post"
verbose_name_plural = "Blog Posts"
def __str__(self):
return self.title
views.py
def blogpost(request):
if request.method == "POST":
form = BlogPostForm(request.POST, request.FILES)
if form.is_valid():
form = form.save(commit=False)
form.creator = request.user
form.save()
messages.success(request, f'Hi, Your Post have been sent for review and would be live soon!')
return redirect('blog:home')
else:
form = BlogPostForm()
context = {
"form": form
}
return render(request, 'blog/AddPost.html', context)
urls.py
path('', views.blog_list, name="home"),
path('post/<int:pk>', views.blog_detail, name="blog-details"),
path('post/categories/<slug:category_slug>', views.category, name="category"),
path('post/tags/<slug:tag_slug>', views.tag, name="tags"),
path('post/create/', views.blogpost, name="add-post"),
forms.py
class BlogPostForm(forms.ModelForm):
image = forms.ImageField(widget=forms.ClearableFileInput(attrs={'multiple': True}), required=True)
# content = forms.CharField(widget=forms.Textarea(attrs={'class': 'input is-medium'}), required=True)
tags = forms.CharField(widget=forms.TextInput(attrs={'class': 'input is-medium'}), required=True)
class Meta:
model = Blog
fields = ('title', 'content', 'image', 'category', 'tags')
addpost.html
<form action="" method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{form|crispy}}
<div class="form-group">
<button class="btn theme-bg rounded" type="submit">Send Message</button>
</div>
</form>
любая помощь будет признательна
Поскольку первичный ключ не является AutoField
или BigAutoField
, он не будет автоматически присваивать значение.
Вы должны указать функцию, которая может генерировать случайные UUID. Например, вы можете воспользоваться функцией uuid4()
[Python-doc]:
from uuid import uuid4
class Blog(models.Model):
id = models.UUIDField(primary_key=True, default=uuid4, editable=False)
# …
Обратите внимание, что поскольку вы не сохраняете объект вместе с формой, она не будет хранить ManyToManyField
созданного объекта, как, например, tags
. Вы можете переписать представление на:
def blogpost(request):
if request.method == "POST":
form = BlogPostForm(request.POST, request.FILES)
if form.is_valid():
form.instance.creator = request.user
form.save() # ← no commit=False
messages.success(request, f'Hi, Your Post have been sent for review and would be live soon!')
return redirect('blog:home')
else:
form = BlogPostForm()
context = {
'form': form
}
return render(request, 'blog/AddPost.html', context)