首页 > 解决方案 > 我的基于类的视图没有在 Django 类的 form-valid(self,form) 中添加 slug 和标签

问题描述

            # Post Model for addding the Post object to the DataBase
            class Post(models.Model):
                STATUS_CHOICE = [
                    ('draft', "Draft"),
                    ('published', "Published")
                ]
                title = models.CharField(max_length=300)
                slug = models.SlugField(max_length=250, unique_for_date="publish", null=True, blank=True)
                author = models.ForeignKey(User, related_name="blog_posts", on_delete=models.CASCADE)
                body = RichTextField()
                publish = models.DateTimeField(default=timezone.now)
                created = models.DateTimeField(auto_now_add=True)
                updated = models.DateTimeField(auto_now=True)
                status = models.CharField(max_length=10, choices=STATUS_CHOICE, default="draft")
                image_upload = models.ImageField(blank=True, null=True, upload_to="post_pics")
                # For Tagging Features
                tags = TaggableManager(blank=True)

                class Meta:
                    ordering = ('-publish',)

                def __str__(self):
                    return self.title

                def get_absolute_url(self):
                    return reverse('post_detail',
                                   args=[self.publish.strftime('%Y'),
                                         self.publish.strftime('%m'),
                                         self.publish.strftime('%d'),
                                         self.slug])


        # url for adding the creating and saving the post object to the Database
        url(r'^create_post/', views.PostCreateView.as_view(), name="create_post")


    # Class-Based View for adding the Post
    class PostCreateView(LoginRequiredMixin, CreateView):
        model = Post
        fields = ['title', 'body', 'status', 'tags', 'image_upload']

        def get_success_url(self, **kwargs):
            return self.object.get_absolute_url()

        def form_valid(self, form):
            obj = form.save(commit=False)
            obj.author = self.request.user
            obj.slug = slugify(obj.title)
            obj = form.save()
            obj.tags.add(slugify(obj.title))
            obj.save()
            return super(PostCreateView, self).form_valid(form)


# form for adding the fields to the Post Model
<!DOCTYPE html>
<html lang="en">
{% load crispy_forms_tags %}
<head>
    <meta charset="UTF-8">
    <title>Create Posts</title>
</head>
<body class="container" style="text-align:center;border:1px solid red;padding:10px;">
{% include './post/navbar.html' %}
<div class="alert alert-info" style="text-align:center;display:inline-block">
    Create Post
</div>
<div>
    <form method="POST" enctype="multipart/form-data" style="width:80%;margin:0px auto">
        {% csrf_token %}
        {{form.media}}
        {{form|crispy}}
        <input type="hidden" name="next" value="{{next}}">
        <input type="submit" name="Register" class="btn btn-success" value="POST">
    </form>
</div>
</body>
</html>

这里添加的 slug 没有保存到数据库中,而是用户在表单中输入的实际标题被保存在数据库中。此外,如果用户无法输入标签,我将添加标签。在这种情况下,我通过标题的 slugification 根据标题输入标签,但是标签被添加到 Taggit 模型中,但没有被输入到 Post 模型的标签字段中。

标签: djangodjango-class-based-views

解决方案


尝试将其添加到您的 Post 类中。

def save(self, *args, **kwargs):
    """
    form post - auto save slug
    """
    self.slug = slugify(self.title)
    super(Post, self).save(*args, **kwargs)

推荐阅读