Phi*_*ler 5 django translation django-models django-hvad
背景:我使用django-hvad并拥有TranslatableModel.在其中TranslatedFields我有一个slug属性,应该title在保存模型时使用属性自动创建.
问题:TranslatedFields保存实例时很难设置其中一个的值.一个有效的解决方案是覆盖save_translations我的方法TranslatableModel如下.只有最后一行与原始行不同:
@classmethod
def save_translations(cls, instance, **kwargs):
"""
The following is copied an pasted from the TranslatableModel class.
"""
opts = cls._meta
if hasattr(instance, opts.translations_cache):
trans = getattr(instance, opts.translations_cache)
if not trans.master_id:
trans.master = instance
# The following line is different from the original.
trans.slug = defaultfilters.slugify(trans.title)
trans.save()
Run Code Online (Sandbox Code Playgroud)
这个解决方案并不好用,因为它使用了复制和粘贴.有没有更好的方法来实现同样的目标?
以下的答案必须假设您正在使用的管理系统自动生成slug的title.这可能是您的确切情况,也可能不是,但它可能是相关的.
这是Django-hvad项目页面中解释的扩展.
实现您的功能的方法是admin.py在您的应用程序的文件中.您需要扩展该类的__init__()方法TranslatableAdmin.
比如说,你的模型被调用了Entry.简化的代码models.py可以是以下几行:
from django.db import models
from hvad.models import TranslatableModel, TranslatedFields
class Entry(TranslatableModel):
translations = TranslatedFields(
title=models.CharField(max_length=100,),
slug=models.SlugField(),
meta={'unique_together': [('language_code', 'slug')]},
)
def __unicode__(self):
return self.lazy_translation_getter('title')
Run Code Online (Sandbox Code Playgroud)
您的相应admin.py文件应如下所示:
from django.contrib import admin
from hvad.admin import TranslatableAdmin
from .models import Entry
class EntryAdmin(TranslatableAdmin):
def __init__(self, *args, **kwargs):
super(EntryAdmin, self).__init__(*args, **kwargs)
self.prepopulated_fields = {'slug': ('title',)}
admin.site.register(Entry, EntryAdmin)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1779 次 |
| 最近记录: |