这是我在 models.py 文件中的翻译设置,在我进行同步迁移后,django-parler 2.0.1 将不会在管理站点中显示产品字段。我目前使用的是 Django 3.0.3。
from django.db import models
from django.urls import reverse
from parler.models import TranslatableModel, TranslatedFields
class Category(TranslatableModel):
translations = TranslatedFields(
name = models.CharField(max_length=200,
db_index=True),
slug = models.SlugField(max_length=200,
db_index=True,
unique=True)
)
class Meta:
# ordering = ('name',)
verbose_name = 'category'
verbose_name_plural = 'categories'
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('shop:product_list_by_category',
args=[self.slug])
class Product(TranslatableModel):
translations = TranslatedFields(
name = models.CharField(max_length=200, db_index=True),
slug = models.SlugField(max_length=200, db_index=True),
description = models.TextField(blank=True)
)
category = models.ForeignKey(Category,
related_name='products',
on_delete=models.CASCADE)
image = models.ImageField(upload_to='products/%Y/%m/%d',
blank=True)
price = models.DecimalField(max_digits=10, decimal_places=2)
available = models.BooleanField(default=True)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
#class Meta:
# ordering = ('name',)
# index_together = (('id', 'slug'),)
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('shop:product_detail',
args=[self.id, self.slug])
我已在 admin.py 文件中注册了模型,但它不会显示产品描述和价格字段,我得到的只是翻译后的选项卡。
from django.contrib import admin
from .models import Category, Product
from parler.admin import TranslatableAdmin
@admin.register(Category)
class CategoryAdmin(TranslatableAdmin):
list_display = ['name', 'slug']
def get_prepopulated_fields(self, request, obj=None):
return {'slug': ('name',)}
@admin.register(Product)
class ProductAdmin(TranslatableAdmin):
list_display = ['name', 'slug', 'price',
'available', 'created', 'updated']
list_filter = ['available', 'created', 'updated']
list_editable = ['price', 'available']
def get_prepopulated_fields(self, request, obj=None):
return {'slug': ('name',)}
我想知道什么我做错了,我得到这个,我想知道是否有更好的方法来使用 Django-parler 2.0.1 进行翻译配置。欢迎任何建议!
问题在于在
ProductAdmin
中的
list_display
中引用了
price
、
available
、
created
和
updated
。这些字段不是翻译字段,因此不应包含在
TranslatedFields
中。
要解决此问题,需要将这些字段添加到
list_display
中,但
在从
TranslatableAdmin
继承的管理类之外
。
以下是如何修改的
ProductAdmin
类的代码:
@admin.register(Product)
class ProductAdmin(TranslatableAdmin):
list_display = ['name', 'slug'] # 只包含翻译字段
list_filter = ['available', 'created', 'updated']
list_editable = ['price', 'available']
def get_prepopulated_fields(self, request, obj=None):
return {'slug': ('name',)}
# 在内部类中定义非翻译字段
class ProductAdminForm(forms.ModelForm):
class Meta:
model = Product
fields = '__all__' # 包含所有字段
# 使用内部类覆盖默认表单
form = ProductAdminForm
# 在外部添加非翻译字段到 list_display
ProductAdmin.list_display += ['price', 'available', 'created', 'updated']
解释:
-
将非翻译字段从
list_display
中移除: 首先,我们从ProductAdmin
的list_display
中移除了price
、available
、created
和updated
,因为它们不是翻译字段。 -
创建内部类
ProductAdminForm
: 我们创建了一个名为ProductAdminForm
的内部类,它继承自forms.ModelForm
。这个类用于定义我们将在管理页面中使用的表单。 -
在
ProductAdminForm
中指定fields = '__all__'
: 我们在ProductAdminForm
的Meta
类中设置fields = '__all__'
,以确保表单包含模型中的所有字段,包括非翻译字段。 -
使用
ProductAdminForm
覆盖默认表单: 我们通过将ProductAdmin
的form
属性设置为ProductAdminForm
来覆盖默认表单。 -
将非翻译字段添加到
list_display
: 最后,我们在ProductAdmin
类定义之后,使用+=
运算符将非翻译字段 (price
,available
,created
,updated
) 添加到list_display
中。
这样,Django Parler 就能正确处理翻译字段,而 Django 管理站点也能正确显示所有字段,包括非翻译字段。
标签:python,django,python-3.x,django-models,django-parler From: 60984340