如何在 Django 中自定义 slug 字段?
How do I customize a slug field in Django?
我检查过 this 但我需要连接两个字段中的内容
好的,问题来了。
我有两个模型,brand
和 product
,看起来像这样:
品牌型号
class Brand(models.Model):
name = models.CharField(max_length=29)
website = models.URLField()
def __unicode__(self):
return self.name
产品型号
class Product(models.Model):
brand = models.ForeignKey(Brand)
name = models.CharField(max_length=140)
slug = models.SlugField()
def __unicode__(self):
return self.name
管理方法
from .models import Product
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
prepopulated_fields = {'slug': ('name',)}
模型输入示例:
**Brand**
Name: Example
Website: http://www.example.com
**Product**
Brand: Example (Selection)
Name: Product
Slug: product(prepopulated)
我希望子弹 example-product
而不是 product
。我怎样才能将品牌和名称连接起来作为 slug。
感谢您的帮助。
仅将品牌添加到 prepopulated_fields 词典 returns id 而不是 str/unicode 值。
class ProductAdmin(admin.ModelAdmin):
prepopulated_fields = {'slug': ('brand', 'name',)}
一种方法是添加 save_model 方法 ModelAdmin
from django.utils.text import slugify
class ProductAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
# don't overwrite manually set slug
if form.cleaned_data['slug'] == "":
obj.slug = slugify(form.cleaned_data['brand']) + "-" + slugify(form.cleaned_data['name'])
obj.save()
你不能。根据 Django 文档:
prepopulated_fields doesn’t accept DateTimeField, ForeignKey, nor ManyToManyField fields.
Link: https://docs.djangoproject.com/en/1.8/ref/contrib/admin/
我试过了:
prepopulated_fields = {'slug': ('brand', 'name')}
这会在品牌 ID 后附加名称而不是品牌名称,因此您得到“1-product”而不是 'example-product'
更新:将 slug 字段保存到数据库中和在管理页面中显示 slug 字段是两件不同的事情。保存会将字符串保存到数据库中。但 'prepopulated_fields' 仅用于显示。它只影响管理页面的外观。
您可以在产品保存上添加一个 slugify 函数(免责声明:我没有尝试使用外键执行此操作,所以我不是 100% 确定,但这种方法对我有用,请告诉我是否它适合你)。
from unidecode import unidecode
from django.template.defaultfilters import slugify
class Product(models.Model):
...
def save(self):
if not self.id: # if this is a new item
newslug = '{0} {1}'.format(self.brand__name, self.name)
self.slug = slugify(unidecode(newslug))
super(Product, self).save()
我检查过 this 但我需要连接两个字段中的内容 好的,问题来了。
我有两个模型,brand
和 product
,看起来像这样:
品牌型号
class Brand(models.Model):
name = models.CharField(max_length=29)
website = models.URLField()
def __unicode__(self):
return self.name
产品型号
class Product(models.Model):
brand = models.ForeignKey(Brand)
name = models.CharField(max_length=140)
slug = models.SlugField()
def __unicode__(self):
return self.name
管理方法
from .models import Product
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
prepopulated_fields = {'slug': ('name',)}
模型输入示例:
**Brand**
Name: Example
Website: http://www.example.com
**Product**
Brand: Example (Selection)
Name: Product
Slug: product(prepopulated)
我希望子弹 example-product
而不是 product
。我怎样才能将品牌和名称连接起来作为 slug。
感谢您的帮助。
仅将品牌添加到 prepopulated_fields 词典 returns id 而不是 str/unicode 值。
class ProductAdmin(admin.ModelAdmin):
prepopulated_fields = {'slug': ('brand', 'name',)}
一种方法是添加 save_model 方法 ModelAdmin
from django.utils.text import slugify
class ProductAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
# don't overwrite manually set slug
if form.cleaned_data['slug'] == "":
obj.slug = slugify(form.cleaned_data['brand']) + "-" + slugify(form.cleaned_data['name'])
obj.save()
你不能。根据 Django 文档:
prepopulated_fields doesn’t accept DateTimeField, ForeignKey, nor ManyToManyField fields.
Link: https://docs.djangoproject.com/en/1.8/ref/contrib/admin/
我试过了:
prepopulated_fields = {'slug': ('brand', 'name')}
这会在品牌 ID 后附加名称而不是品牌名称,因此您得到“1-product”而不是 'example-product'
更新:将 slug 字段保存到数据库中和在管理页面中显示 slug 字段是两件不同的事情。保存会将字符串保存到数据库中。但 'prepopulated_fields' 仅用于显示。它只影响管理页面的外观。
您可以在产品保存上添加一个 slugify 函数(免责声明:我没有尝试使用外键执行此操作,所以我不是 100% 确定,但这种方法对我有用,请告诉我是否它适合你)。
from unidecode import unidecode
from django.template.defaultfilters import slugify
class Product(models.Model):
...
def save(self):
if not self.id: # if this is a new item
newslug = '{0} {1}'.format(self.brand__name, self.name)
self.slug = slugify(unidecode(newslug))
super(Product, self).save()