Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django翻译模型选择_Python_Django_Django Models - Fatal编程技术网

Python django翻译模型选择

Python django翻译模型选择,python,django,django-models,Python,Django,Django Models,我需要为模型上的字段转换一个选项。 我有这样的想法: from django.utils.translation import ugettext as _ from django.db import models class MyModel(models.Model): TYPES = ( (1, _("Option one")), (2, _("Option two")) (3, _("Option three")) )

我需要为模型上的字段转换一个选项。 我有这样的想法:

from django.utils.translation import ugettext as _
from django.db import models

class MyModel(models.Model):
    TYPES = (
        (1, _("Option one")),
        (2, _("Option two"))
        (3, _("Option three"))
    )
    type = models.CharField(max_length=50, choices=TYPES)
在此之前,我在登录视图上有一个脚本:

request.session['django_language'] = request.POST.get("language")
因此,问题在于django调用MyModel上的类型时,因为request.session['django_language']不存在

任何帮助都将不胜感激


谢谢…

在models.py中,您需要

from django.utils.translation import ugettext_lazy as _
ugettext_lazy将返回可调用的字符串,而不是已翻译的字符串。稍后计算callable时,它将返回已翻译的字符串。这将足够晚,它将获得视图/模板处理的正确语言


下一部分不是您的问题,而是:在django中,您应该使用表单来处理用户输入,而不是直接从request.POST.get访问它。这是一个完全不同的话题,但我不能让它在这个答案中不被提及,因为我担心其他人可能会使用这种方法。

models.py

CATEGORIES = (  
    ('LAB', 'labor'),
    ('CAR', 'cars'),
    ('TRU', 'trucks'),
    ('WRI', 'writing'),
)


class PostAd(models.Model):  
    name = models.CharField(max_length=50)
    email = models.EmailField()
    gist = models.CharField(max_length=50)
    category = models.CharField(max_length=3, choices=CATEGORIES)
CATEGORIES = (  
    ('LAB', 'labor'),
    ('CAR', 'cars'),
    ('TRU', 'trucks'),
    ('WRI', 'writing'),
)

category = forms.ChoiceField(choices=CATEGORIES, required=True)
forms.py

CATEGORIES = (  
    ('LAB', 'labor'),
    ('CAR', 'cars'),
    ('TRU', 'trucks'),
    ('WRI', 'writing'),
)


class PostAd(models.Model):  
    name = models.CharField(max_length=50)
    email = models.EmailField()
    gist = models.CharField(max_length=50)
    category = models.CharField(max_length=3, choices=CATEGORIES)
CATEGORIES = (  
    ('LAB', 'labor'),
    ('CAR', 'cars'),
    ('TRU', 'trucks'),
    ('WRI', 'writing'),
)

category = forms.ChoiceField(choices=CATEGORIES, required=True)
category.html

<!-- category -->
<div class="fieldWrapper">
    {{ form.category.errors }}
    <label for="id_category">Category</label>
    {{ form.category }}
</div>
<!-- location -->

{{form.category.errors}
类别
{{form.category}}

我想我来晚了,但我刚刚解决了一个类似的问题。django文档中有一个非常好的解决方案

from django.utils.translation import gettext_lazy as _
class Student(models.Model):
    class YearInSchool(models.TextChoices):
        FRESHMAN = 'FR', _('Freshman')
        SOPHOMORE = 'SO', _('Sophomore')
        JUNIOR = 'JR', _('Junior')
        SENIOR = 'SR', _('Senior')
        GRADUATE = 'GR', _('Graduate')

    year_in_school = models.CharField(max_length=2, choices=YearInSchool.choices, default=YearInSchool.FRESHMAN,)

或者

  • 在应用程序文件夹中部署枚举(enums.py),如下所示:
  • 显然,然后将枚举导入到模型中,并根据需要使用。 e、 g

    在这个阶段,我假设您已经编写了语言环境文件,所以您已经设置了.po文件

    #Append your translation content within .po | or via rosetta app
    
    django-admin makemessages -all
    
    django-admin compilemessages
    

    单击替代语言链接

    这里是一个转换保存在数据库中的值的示例

    #models.py
    
    from django.db import models
    from django.utils.translation import gettext_noop
    
    
    CATEGORY_CHOICE = (
      ("choice one", gettext_noop("choice one")) # gettext_noop will mark the string to be translated when you later do "python3 manage.py makemessages"
      ("choice two", gettext_noop("choice two"))
    )
    
    class Foo(models.Model)
      category = models.CharField(choices=CATEGORY_CHOICES, max_length=50)
    
    
    只需执行
    python3 manage.py makemessages
    即可生成区域设置django.po文件,输入翻译。然后执行,
    python3 manage.py compilemessages
    编译您的区域设置文件

    现在,在从视图或api返回此字段时,请确保执行以下操作:

    #views.py
    
    from django.utils.translation import ugettext as _
    
    def get_category():
      foo = Foo.objects.get(id=1)
      return _(foo.category)
    

    我想澄清一下:您已经编写了一个使用request.POST.get(“语言”)值的视图,并且您没有使用django表单来管理输入?您试图在会话中分配给“django_language”,但失败了?请显示整个视图功能,并粘贴您得到的实际错误。我将尝试澄清。我执行这一行:
    request.session['django_language']=request.POST.get(“语言”)
    当用户启动会话时,django在英语和西班牙语之间切换。对于我使用的所有模板,
    {%trans“Hello”%}
    都被翻译。但pyhon在此之前“编译”了所有模型。因此,类属性不会实时进行翻译。唯一的方法是更改配置文件中的语言选项,但需要重新启动服务器。所有模型的示例都显示了选项,使用的方式与我的相同。虽然这个代码片段可以解决这个问题,但确实有助于提高您文章的质量。请记住,您将在将来为读者回答此问题,而这些人可能不知道您的代码建议的原因。此答案似乎无法解决此问题,因为它不包含任何翻译。唯一对我有帮助的答案是,因为它包含视图示例!