Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.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
要求从文件中澄清Django车型选择代码_Django_Choicefield - Fatal编程技术网

要求从文件中澄清Django车型选择代码

要求从文件中澄清Django车型选择代码,django,choicefield,Django,Choicefield,在官方文件中,我们给出了以下示例: class Student(models.Model): FRESHMAN = 'FR' SOPHOMORE = 'SO' JUNIOR = 'JR' SENIOR = 'SR' YEAR_IN_SCHOOL_CHOICES = ( (FRESHMAN, 'Freshman'), (SOPHOMORE, 'Sophomore'), (JUNIOR, 'Junior'),

在官方文件中,我们给出了以下示例:

class Student(models.Model):
    FRESHMAN = 'FR'
    SOPHOMORE = 'SO'
    JUNIOR = 'JR'
    SENIOR = 'SR'
    YEAR_IN_SCHOOL_CHOICES = (
        (FRESHMAN, 'Freshman'),
        (SOPHOMORE, 'Sophomore'),
        (JUNIOR, 'Junior'),
        (SENIOR, 'Senior'),
    )
    year_in_school = models.CharField(max_length=2,
                                      choices=YEAR_IN_SCHOOL_CHOICES,
                                      default=FRESHMAN)
将变量设置为字符串的目的是什么?在学校选择的
YEAR\u的实际元组之前以及之外
? 那些字符串在哪里使用? 这些变量与元组中使用的变量相同吗? 若然,原因为何?这似乎是一个额外的、不必要的步骤

在本例之前的示例中,他们使用不同的
学年选择
,这并没有帮助。谢谢你的澄清

更新

因为我坐在这里,在我们说话的时候正在与这个代码搏斗,感谢大家的快速响应。它们都增加了我的理解力。我认为@shang wang对我的问题有着迄今为止最简洁、最有反应的回答。1+用于获取_FOO_display()的引用。但在我的特定用例中,管理员可以选择告诉最终用户如何评估特定对象。因此,我希望评估的“人类可读”形式是最终html模板中显示给站点最终用户的内容。根据这些答案,现在我想知道这是否是实现我的目标的最佳方式?解决方案是:

`

html显示表

对象名称|评估

FOO | FOO.get_evaluation_display()

或者可能:

对于对象中的FOO:
对象名称|评估
FOO.name | FOO.get_evaluation_display()
"

此特定模型的目的是向最终用户显示专家对FOO的评估。每个FOO可以有许多这样的评估。虽然这些评估通常非常详细,但可以进行分类,因此选择字段。如果用户愿意,可以单击“上一页”以完整阅读原始评估。因此,FOO是在不同的模型上定义的,并通过外键链接到评估模型。那么get_FOO_display()在这里实际工作吗,因为选择字段不在FOO是实例的模型上


p、 我意识到这已经变成了一个不同的问题,所以如果它需要移动或其他什么,我同意,但它确实直接来自原始问答。让我知道。Thx

变量
YEAR\u IN_SCHOOL\u CHOICES
作为字段
YEAR\u IN_SCHOOL
中的所有可能选项。每对中的第一个值将存储在数据库中,而每对中的第二个值将显示在表单下拉列表中(如果使用默认小部件)。像
FRESHMAN='FR'
这样的单独选择声明是为了确保它们被封装在类中。可以对每个学生对象执行以下操作:

# assign the value to student's year_in_school
student.year_in_school = Student.FRESHMAN
student.save()

# this will print 'FR'
db_value = student.year_in_school
print db_value

# this will print 'Freshman'
pretty_display_value = student.get_year_in_school_display()
print pretty_display_value

Django doc for.

变量
YEAR\u IN\u SCHOOL\u选项
YEAR\u IN\u SCHOOL
字段中用作所有可能的选项。每对中的第一个值将存储在数据库中,而每对中的第二个值将显示在表单下拉列表中(如果使用默认小部件)。像
FRESHMAN='FR'
这样的单独选择声明是为了确保它们被封装在类中。可以对每个学生对象执行以下操作:

# assign the value to student's year_in_school
student.year_in_school = Student.FRESHMAN
student.save()

# this will print 'FR'
db_value = student.year_in_school
print db_value

# this will print 'Freshman'
pretty_display_value = student.get_year_in_school_display()
print pretty_display_value

Django doc for.

文档似乎解释了示例后面段落中的推理

尽管您可以在模型类之外定义一个选项列表 请参考它,为该文档中的每个选项定义选项和名称 模型类将所有这些信息保存在使用它的类中, 并使选择易于参考(例如,
学生。大二学生将
在已导入学生模型的任何位置工作)


他们似乎建议最好使用options类变量,这样就不必引用原始val(例如,
'FR'
)。它还可以确保您在导入此模型的任何地方都可以访问这些变量。

文档似乎解释了示例后面段落中的推理

# within your models.Model class...
STUDENT_TYPE_CHOICES = (
    FRESHMAN = 'FR'
    SOPHOMORE = 'SO'
    JUNIOR = 'JR'
    SENIOR = 'SR'
)
year_in_school = models.CharField(max_length=2,
                                  choices=YEAR_IN_SCHOOL_CHOICES,
                                  default=FRESHMAN)




This means elsewhere in your code if you want to specify a choice field value, you’d have to enter the first slot of the tuple’s value, e.g.:

year_in_school = models.objects.filter(year_in_school_type='SOPHOMORE') 


**This is pretty terrible** since it’s hardcoded in our source, possibly over many files.
尽管您可以在模型类之外定义一个选项列表 请参考它,为该文档中的每个选项定义选项和名称 模型类将所有这些信息保存在使用它的类中, 并使选择易于参考(例如,
学生。大二学生将
在已导入学生模型的任何位置工作)

他们似乎建议最好使用options类变量,这样就不必引用原始val(例如,
'FR'
)。它还可以确保您在导入此模型的任何地方都可以访问这些变量

# within your models.Model class...
STUDENT_TYPE_CHOICES = (
    FRESHMAN = 'FR'
    SOPHOMORE = 'SO'
    JUNIOR = 'JR'
    SENIOR = 'SR'
)
year_in_school = models.CharField(max_length=2,
                                  choices=YEAR_IN_SCHOOL_CHOICES,
                                  default=FRESHMAN)




This means elsewhere in your code if you want to specify a choice field value, you’d have to enter the first slot of the tuple’s value, e.g.:

year_in_school = models.objects.filter(year_in_school_type='SOPHOMORE') 


**This is pretty terrible** since it’s hardcoded in our source, possibly over many files.
要避免使用以下类别: pip安装enum34 进口检验 从枚举导入枚举

class ChoiceEnum(Enum):

    @classmethod
    def choices(cls):
        # get all members of the class
        members = inspect.getmembers(cls, lambda m: not(inspect.isroutine(m)))
        # filter down to just properties
        props = [m for m in members if not(m[0][:2] == '__')]
        # format into django choice tuple
        choices = tuple([(str(p[1].value), p[0]) for p in props])
        return choices


**That’s the hard work over.**

Now  you create your choice field:

from common.utils import ChoiceEnum

class StudentTypes(ChoiceEnum):
    FRESHMAN = 'FR'
    SOPHOMORE = 'SO'
    JUNIOR = 'JR'
    SENIOR = 'SR'

# within your models.Model class...
year_in_school = models.CharField(max_length=1, choices=StudentTypes.choices())


Now if we need to access StudentTypes from elsewhere in our source code, we can simply:

# import StudentTypes
year_in_school =  models.objects.filter(year_in_school=StudentTypes.junior.value)
要避免使用以下类别: pip安装enum34 进口检验 从枚举导入枚举

class ChoiceEnum(Enum):

    @classmethod
    def choices(cls):
        # get all members of the class
        members = inspect.getmembers(cls, lambda m: not(inspect.isroutine(m)))
        # filter down to just properties
        props = [m for m in members if not(m[0][:2] == '__')]
        # format into django choice tuple
        choices = tuple([(str(p[1].value), p[0]) for p in props])
        return choices


**That’s the hard work over.**

Now  you create your choice field:

from common.utils import ChoiceEnum

class StudentTypes(ChoiceEnum):
    FRESHMAN = 'FR'
    SOPHOMORE = 'SO'
    JUNIOR = 'JR'
    SENIOR = 'SR'

# within your models.Model class...
year_in_school = models.CharField(max_length=1, choices=StudentTypes.choices())


Now if we need to access StudentTypes from elsewhere in our source code, we can simply:

# import StudentTypes
year_in_school =  models.objects.filter(year_in_school=StudentTypes.junior.value)