为什么方法“prepopulated_fields”在 Django 管理中保存对象后不起作用?

问题描述 投票:0回答:2

我描述了一个模型,其中一个 slug 字段自动填充另一个字段的值,但在保存对象后,slug 停止工作。我希望 slug 字段在每次保存对象时都能按预期工作。

models.py:

class Product(models.Model):
    name = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField(max_length=200, db_index=True, unique=True)

admin.py:

@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    save_as = True
    prepopulated_fields = {'slug': ('name',)}

文档说这是故意的。如果有人可以分享他们解决这个问题的经验,我会很高兴。

javascript django django-models django-admin slug
2个回答
1
投票

这应该有效

class Product(models.Model):
    name = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField(max_length=200, db_index=True, unique=True)
    
    def save(self, *args, **kwargs):
        from django.utils.text import slugify
        self.slug = slugify(self.name)
        super(Product, self).save(*args, **kwargs)

0
投票

文档在下面说所以

prepopulated_fields
在添加对象后不起作用:

预填充的字段在一个值被修改后不会被 JavaScript 修改 被保存。通常不希望 slug 发生变化(这会 如果在其中使用了 slug,则会导致对象的 URL 发生变化)。

所以不要使用

prepopulated_fields
,你应该覆盖save(),如下所示,每次添加和更改对象时将
name
保存为
slug

from django.utils.text import slugify

class Product(models.Model):
    name = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField(max_length=200, db_index=True, unique=True)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        super().save(*args, **kwargs)
© www.soinside.com 2019 - 2024. All rights reserved.