首页 > 编程问答 >在我将迁移应用于翻译后,我遇到了 django-parler 2.0.1 的问题,它不会在管理站点中显示产品字段

在我将迁移应用于翻译后,我遇到了 django-parler 2.0.1 的问题,它不会在管理站点中显示产品字段

时间:2024-07-22 12:51:24浏览次数:8  
标签:python django python-3.x django-models django-parler

enter image description here 这是我在 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']

解释:

  1. 将非翻译字段从 list_display 中移除: 首先,我们从 ProductAdmin list_display 中移除了 price available created updated ,因为它们不是翻译字段。
  2. 创建内部类 ProductAdminForm 我们创建了一个名为 ProductAdminForm 的内部类,它继承自 forms.ModelForm 。这个类用于定义我们将在管理页面中使用的表单。
  3. ProductAdminForm 中指定 fields = '__all__' 我们在 ProductAdminForm Meta 类中设置 fields = '__all__' ,以确保表单包含模型中的所有字段,包括非翻译字段。
  4. 使用 ProductAdminForm 覆盖默认表单: 我们通过将 ProductAdmin form 属性设置为 ProductAdminForm 来覆盖默认表单。
  5. 将非翻译字段添加到 list_display 最后,我们在 ProductAdmin 类定义之后,使用 += 运算符将非翻译字段 ( price , available , created , updated ) 添加到 list_display 中。

这样,Django Parler 就能正确处理翻译字段,而 Django 管理站点也能正确显示所有字段,包括非翻译字段。

标签:python,django,python-3.x,django-models,django-parler
From: 60984340

相关文章

  • Python:定期检测断开故障的USB设备并重新初始化实例
    我有一个USB设备,有时会通过USB端口发送串行数据。问题是设备出现故障,有时会无缘无故地断开连接并再次连接到电脑。问题不大,但在这些情况下我需要重新初始化serial.Serial(port)实例,这有点烦人。该设备没有可以从我那里收到的任何命令,我可以验证它是否已连接。我可以......
  • 【校招+社招】华为OD机试 - 拼接URL(Java、JavaScript、Python、C、C++)
    鱼弦:公众号【红尘灯塔】,CSDN博客专家、内容合伙人、新星导师、全栈领域优质创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen)算法概述URL拼接(URL拼接)是指将多个URL组件(方案、主机、端口、路径、查询参......
  • 使用 Google Colab 时,Python 包“datasets”从 virtualenv 目录“site-packages”中消
    我正在使用GoogleColab并尝试创建一个虚拟环境来工作。我的代码是:fromgoogle.colabimportdrivedrive.mount('/content/drive')!pipinstallvirtualenvmyenv_dir='/content/drive/MyDrive/virtual_env/'!virtualenv{myenv_dir}!chmod+x{myen......
  • Python 3 - openpyxl - 按名称迭代列
    使用openpyxl不按数字而是按列标题(ws第一行中的字符串值)迭代列的最简单方法是什么:如下所示:forcellinws.columns['revenue']:print(cell.value)不幸的是,openpyxl不直接支持像ws.columns['revenue']这样按列标题进行迭代。openpyxl......
  • 在 Django 表单中使用正确的 Bootstrap CSS 进行单选表单输入
    如何让Django表单将正确的Bootstrap渲染到Radioselect表单输入?我在表单中传递了form-controlform-checkclassess,但生成的表单HTML对于radioselect选项并不准确。我正在寻找渲染引导程序原色和内联单选按钮。表单classPersonForm(forms.Form......
  • Python selenium 网络抓取 recaptcha
    我想抓取一个网站,但在此之前有一个验证码,我什至使用api获取了数据,并且我还将其注入到网站中,因为网页没有提交按钮,我无法提交。流程是这样的,如果我解决同一网址中的验证码,隐藏的内容将被显示。但它并没有得到解决。我到处都找过了。我找不到解决方案。谁能帮我解决这个问题?......
  • Python 装饰器 详解+案例
    Python装饰器是一种特殊的函数,用于修改其他函数的功能。装饰器可以在不改变原函数代码的情况下,对函数进行增加、修改或者扩展功能。装饰器的语法形式是在函数定义前使用@符号,并在@后面加上装饰器的名称。装饰器函数接受被装饰函数作为参数,并返回一个修改后的函数。impo......
  • 如何在 vercel 部署中路由 python 和 typescript 无服务器函数
    我从一个带有Next.js和Typescript前端以及python后端的全栈应用程序开始。由于我们想在vercel上部署,因此我们将所有后端功能迁移到/api文件夹中的typescript函数中,可通过以下方式访问:fetch('api/**foldername**)问题是我有一个简单的pytorch模型,因此......
  • 通过django admin添加动态字段
    我环顾了堆栈,但找不到任何答案。所以我有一个像这样的模型:classDynamicModel(models.Model):config=models.JSONField()def__str__(self):returnself.config我现在想要做的是将json字段键值对显示为独立字段,并且还能够以相同的方式编辑它们,就......
  • python中datetime模块
    datetime模块可以更方便的显示日期,并对日期进行计算。datetime模块中常用的类及其功能描述如下:datetime.datetime------>表示日期时间的类(常用)datetime.timedelta------>表示时间间隔的类(常用)datetime.date------>表示日期的类datetime.time------>表示时间的类datetime.......