我描述了一个模型,其中一个 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',)}
文档说这是故意的。如果有人可以分享他们解决这个问题的经验,我会很高兴。
这应该有效
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)
文档在下面说所以
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)