Когда я пытаюсь создать запись в блоге, отображается 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)
Вернуться на верх