unique_for_date 的使用

Dmi*_*nik 6 python django django-models

我正在尝试使用 unique_for_date 选项来防止在同一日期使用相同的 slug 创建多个帖子。但它似乎根本不起作用:我仍然可以从 shell 和管理仪表板使用相同的 slug 创建帖子。ModelForm 也是如此。我的models.py:

class Post(models.Model):

    STATUS_CHOICES = (
        ('draft', 'Draft'),
        ('published', 'Published'),
        ('suspended', 'Suspended'),
    )

    title = models.CharField(max_length=200)
    slug = models.SlugField(max_length=200, unique_for_date='created')
    status = models.CharField(max_length=15,
                              choices=STATUS_CHOICES,
                              default='draft')
    content = models.TextField(max_length=200000, blank=True)
    # dates
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    publish = models.DateTimeField(default=timezone.now)
Run Code Online (Sandbox Code Playgroud)

我通过更改auto_now_add=True为找到了某种解决问题的方法,default=timezone.now但它仅在通过 django admin 创建对象时显示错误 - 从 shell 或表单创建对象时仍然没有错误。

更新:我知道使用 auto_now_add 设置 editable=False 会导致 django 跳过字段验证,但它并没有解释为什么即使使用default=timezone.now

更新 2:出于某种原因,unique_for_date 仅适用于 django-admin 仪表板表单(至少在我的情况下)。为了对其他表单获得相同的效果,我覆盖了模型的 clean_fields 方法(强制 django 验证唯一字段):

def clean_fields(self, exclude=None):
    super().clean_fields(exclude=exclude)
    self.validate_unique()
Run Code Online (Sandbox Code Playgroud)

小智 2

我认为你正在考虑createdDateTimeField所以它也在考虑时间。尝试将其更改为DateField