django - 我的基于类的视图没有在 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 模型的标签字段中。
解决方案
尝试将其添加到您的 Post 类中。
def save(self, *args, **kwargs):
"""
form post - auto save slug
"""
self.slug = slugify(self.title)
super(Post, self).save(*args, **kwargs)
推荐阅读
- node.js - 克隆每个存储库的问题
- php - 在 PHP 中找不到正确的 3DES 密码
- amazon-web-services - 为什么即使是小文件,aws s3 getObject 也执行缓慢?
- angular - ngx-swiper-wrapper 具有针对不同滑块的多种配置
- php - 如何在没有 javascript 的情况下使用 Apache 服务器在 PHP 中创建简单的 websocket 聊天应用程序
- javascript - JavaScript:使用通配符从父元素中选择所有子元素
- ansible - 如何使用从文件中获取的目录名称使用 ansible 创建目录
- python - 从 hdfs 读取文件 - pyspark
- java - Java Spring Boot - 通过按钮单击将下拉选项选择传递给方法
- eclipse-plugin - 禁用语法错误“符号
使用 CDT 的 Eclipse 插件中的某些符号无法解决”