gpt4 book ai didi

python - Django 模板 : force choices on field and print display value with get_FOO_display()

转载 作者:行者123 更新时间:2023-12-03 09:02:51 27 4
gpt4 key购买 nike

我想要一个有 5 个选择的模型,但我无法强制执行它们并在模板中显示显示值。我使用 CharField(choice=..) 而不是 docs 中的 ChoiceField 或 TypeChoiceField 。我尝试了解决方案here但它们对我不起作用(见下文)。

模型.py:

class Language(models.Model):
language = models.CharField(max_length=20,blank=False)
ILR_scale = (
(5, 'Native'),
(4, 'Full professional proficiency'),
(3, 'Professional working proficiency'),
(2, 'Limited professional proficiency'),
(1, 'Elementary professional proficiency')
)
level = models.CharField(help_text='Choice between 1 and 5', default=5, max_length=25, choices=ILR_scale)
def level_verbose(self):
return dict(Language.ILR_scale)[self.level]
class Meta:
ordering = ['level','id']
def __unicode__(self):
return ''.join([self.language, '-', self.level])

查看.py

..
def index(request):
language = Language.objects.all()
..

mytemplate.html

<div class="subheading strong-underlined mb-3 my-3">
Languages
</div>
{% regroup language|dictsortreversed:"level" by level as level_list %}
<ul>
{% for lan_list in level_list %}
<li>
{% for lan in lan_list.list %}
<strong>{{ lan.language }}</strong>: {{ lan.level_verbose }}{%if not forloop.last%},{%endif%}
{% endfor %}
</li>
{% endfor %}
</ul>

来自外壳:

python3 manage.py shell
from resume.models import Language
l1=Language.objects.create(language='English',level=4)
l1.save()
l1.get_level_display() #This is good
Out[20]: 'Full professional proficiency'

一旦我从 shell 创建语言实例,我就无法加载该网站。它在模板的第 0 行失败,异常类型:KeyError,异常值:'4',异常位置:level_verbose 中的/models.py,第 175 行(这是 level_verbose 方法的返回行)。

此外,我预计 shell 会出现验证错误:

l1.level='asdasd'
l1.save() #Why can I save this instance with this level?

而且我还可以在使用 ChoiceField 时保存上面显示的内容,这意味着我不明白该字段的用途。

如何强制实例在选择中获取字段值,并在模板中显示显示值?

最佳答案

即使当我开始使用 django 时,这也是一个常见问题。首先让我们看一下 django 的功能,您可以像下面那样执行此操作(注意:您选择案例的值将存储为整数,因此您应该使用 models.IntegerField 而不是 models.CharField ):

正如您在文档 FOO 中看到的那样是您的模型的字段名称。在你的情况下它是 level因此,当您想在 shell 或 View 中访问相应的选择值时,您可以使用模型实例调用方法,如下所示,正如您已经提到的:

`l1.get_level_display()`

但是当你想在模板文件中访问它时,你需要像下面这样编写:

{{ l1.get_level_display }}
  • 现在让我们看看您的方法 level_verbose()如果你再次看到你的模型是一个类并且 level_verbose()是您创建的方法,您可以访问 self.ILR_scale直接就像您使用 self.level 一样

创建 ILR_scale 字典的主要问题是它的键是整数值 (i.e. 1, 2, 3, 4, 5)但你已经使用了CharField()存储返回字符串值的级别值 (i.e. '1', '2', '3', '4' or '5')在Python字典中,键1和'1'都是不同的,一个是整数,另一个是字符串。因此,您可以将模型字段更改为 models.IntegerField()或者您可以访问像

这样的键
dict(self.ILR_scal)[int(self.level)]

关于python - Django 模板 : force choices on field and print display value with get_FOO_display(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49091870/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com