【发布时间】:2019-12-20 05:30:08
【问题描述】:
# 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 模型的标签字段中。
【问题讨论】:
标签: django django-class-based-views