如何在Django中自定义slug字段?

时间:2015-05-11 13:30:35

标签: python django django-models django-admin

我已经检查了this,但我需要在两个字段中连接内容 好的,这就是问题所在。

我有两个模型brandproduct,它们看起来像这样:

品牌模型

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)

我希望slug为example-product而不是product。如何将品牌和名称连接成slu ..

感谢您的帮助。

3 个答案:

答案 0 :(得分:10)

将品牌添加到prepopulated_fields字典只返回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()

答案 1 :(得分:3)

你可以在产品保存上添加一个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()

答案 2 :(得分:0)

你做不到。根据Django文档:

  

prepopulated_fields不接受DateTimeField,ForeignKey和ManyToManyField字段。

链接:https://docs.djangoproject.com/en/1.8/ref/contrib/admin/

我试过了:

prepopulated_fields = {'slug': ('brand', 'name')}

这会在品牌ID后面添加名称而不是品牌名称,因此您可以获得“1&product”产品'而不是' example-product'

更新:将slug字段保存到数据库中并在管理页面中显示slug字段是两回事。保存会将字符串保存到数据库中。但是'prepopulated_fields'仅用于展示。它只会影响管理页面的外观。