首页 > 解决方案 > Django 中的 Slug 和日期字段问题的唯一问题

问题描述

我对 Django 代码有疑问,我正在使用模型来创建一个替代的创建后页面,并且生成的日期 wiget 是一个文本输入。自动完成功能也不适用于 Slug。有人可以帮助我吗?

模型.py:

from django.db import models
from django import forms
from django.contrib.auth.models import User
from django.urls import reverse

# Categorie
class Category(models.Model):
    class Meta:
        verbose_name = 'category'
        verbose_name_plural = 'categories'

    name = models.CharField('Titolo', max_length = 250)
    slug = models.SlugField(max_length = 250, unique = True)
    desc = models.TextField('Descrizione', max_length=10000, blank=True)

    def __str__(self):
        return self.name

# Articles
class Article(models.Model):
    title = models.CharField('Titolo', max_length=100)
    author = models.ForeignKey(User, on_delete=models.CASCADE,)
    category = models.ForeignKey (Category, on_delete=models.CASCADE)
    desc = models.CharField('Descrizione', max_length=10000, blank=True, )
    text = models.TextField('Testo', max_length=10000, blank=True)
    image = models.ImageField('Foto', blank=True, upload_to="img")
    data = models.DateTimeField('Data di pubblicazione', blank=True)
    slug = models.SlugField(max_length = 250, null = True, blank = True, unique=True)

    def get_absolute_url(self):
        return reverse("admin", args=(str(self.id)))

    class Meta: # Order post by date
        ordering = ['-data',]
    def __str__(self):
        return "Ciao"

add_post.html:


{% block content %}
    <h1>Add - Post</h1>

    <form method="POST">
        {% csrf_token %}
        {{ form.as_p }}
        <button> Go</button>
    
    </form>
{% endblock content %}

标签: pythondjangowebdjango-modelsdjango-forms

解决方案


您必须覆盖 save 方法才能自动创建 slug

from django.utils.text import slugify


class Category(models.Model):
...

def save(self, *args, **kwargs):
    self.slug = slugify(self.brand_name)
    super(Category, self).save(*args, **kwargs)

这在您更改日期后创建模型时有效,不会改变

data = models.DateTimeField('Data di pubblicazione', auto_now_add=True, blank=True)

每次创建模型并更新模型时,此日期都会更改

data = models.DateTimeField('Data di pubblicazione',auto_now=True blank=True)

推荐阅读