You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Django Parler实现模型翻译时预填充slug字段报错求助

解决Django-parler翻译模型中Slug预填充的错误

错误原因

你遇到的问题核心在于:默认的ModelAdmin无法识别TranslatableFields中定义的翻译字段(比如category_name、移入翻译字段后的slug),因为这些字段实际存储在关联的翻译子模型中,而非主模型本身。


解决方案:使用django-parler专属的TranslatableAdmin

django-parler提供了TranslatableAdmin类,专门用于处理翻译模型的后台管理,它能正确识别翻译字段并支持预填充配置。

情况1:Slug为全局唯一(不随语言变化)

如果希望slug在所有语言中保持一致,保留它在主模型中,修改Admin类如下:

from django.contrib import admin
from parler.admin import TranslatableAdmin
from .models import Category

class CategoryAdmin(TranslatableAdmin):
    prepopulated_fields = {'slug': ('category_name',)}
    # 可选:配置列表显示的字段,用方法获取翻译后的名称
    list_display = ('get_category_name', 'slug')
    
    def get_category_name(self, obj):
        return obj.category_name
    get_category_name.short_description = '分类名称'

admin.site.register(Category, CategoryAdmin)

情况2:Slug随语言变化(每个语言独立生成)

如果需要不同语言对应不同的slug,将slug移入TranslatedFields,再配合TranslatableAdmin配置:

  1. 修改模型,把slug加入TranslatedFields
from django.db import models
from parler.models import TranslatableModel, TranslatedFields
from django.utils.translation import gettext_lazy as _

class Category(TranslatableModel):
    translations = TranslatedFields(
        category_name = models.CharField(_('name'), max_length=50, unique=True),
        description = models.TextField(_('description'), max_length=255, blank=True),
        slug = models.SlugField(max_length=100, unique=True)
    )
    image = models.ImageField(_('image'), default='default_category_image.jpg', upload_to='category_photos')
  1. 配置Admin类
from django.contrib import admin
from parler.admin import TranslatableAdmin
from .models import Category

class CategoryAdmin(TranslatableAdmin):
    prepopulated_fields = {'slug': ('category_name',)}

admin.site.register(Category, CategoryAdmin)

内容的提问来源于stack exchange,提问作者Ldnsky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 10:04:55