【问题标题】:slug not auto generate after add page in django在 django 中添加页面后,slug 不会自动生成
【发布时间】:2021-08-23 17:58:14
【问题描述】:

我尝试为我的 django 网站添加博客文章的页面。但它的 slug 模型在添加到添加帖子页面后不会自动生成,但它在管理页面中运行良好。

标题字段中的示例,当我键入如何快速掌握 python 时,它将在 slug 字段中自动生成,仅在管理页面中带有“-”。但是当我在添加帖子页面上键入相同的内容时,它不会自动生成 slug。

我的代码

models.py

from django.db import models
from django.contrib.auth.models import User
from django_summernote.fields import SummernoteTextField
from django.urls import reverse
from django.template.defaultfilters import slugify

STATUS = (
    (0,"Draft"),
    (1,"Publish")
)
 
class Post(models.Model):
    title = models.CharField(max_length=200, unique=True)
    title_type = models.CharField(max_length=50, unique=True)
    slug = models.SlugField(max_length=200, unique=True)
    author = models.ForeignKey(User, on_delete= models.CASCADE,related_name='blog_posts')
    updated_on = models.DateTimeField(auto_now= True)
    content = SummernoteTextField(blank=True, null=True)
    created_on = models.DateTimeField(auto_now_add=True)
    status = models.IntegerField(choices=STATUS, default=0)
    image = models.ImageField(upload_to='images',null=True, blank=True)


    class Meta:
        ordering = ['-created_on']

    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(Post, self).save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse('home')

views.py

class AddPostView(CreateView):
    model = Post
    form_class = PostForm
    template_name = 'add_post.html'

管理页面

并添加帖子页面

【问题讨论】:

  • 这是因为 django admin 编写了一些 JS 来在您键入时动态更新字段值。如果您想要该功能,您可能需要编写一些 JS,但为什么您希望 slug 字段被用户看到?
  • 如上所述,一种选择是在 JS 中自己实现 slugify 功能,以获得与 django admin 中类似的行为。此外,当您在保存self.slug = slugify(self.title) 期间设置 slug 时,您可以从 UI 中删除 slug 字段并依赖于模型保存期间生成的值。

标签: python python-3.x django django-models


【解决方案1】:

slug 字段不应是可编辑的,请从 AddPostView 和 Admin 的字段中删除“slug”字段。

class AddPostView(CreateView):
    model = Post
    fields = ['title', 'title_type', 'author', 'updated_on', 'content', 
              'created_on', 'status', 'image']
    form_class = PostForm
    template_name = 'add_post.html'

【讨论】:

  • 在想了想我也意识到它并不想在你面前。
猜你喜欢
  • 1970-01-01
  • 2017-07-13
  • 2020-06-19
  • 1970-01-01
  • 1970-01-01
  • 2015-06-26
  • 2019-12-13
  • 2014-02-16
  • 2019-12-11
相关资源
最近更新 更多