Django - 选择字段显示键,而不是值

Posted

技术标签:

【中文标题】Django - 选择字段显示键,而不是值【英文标题】:Django -- choice field shows key, not value 【发布时间】:2012-02-20 00:02:16 【问题描述】:

我有一个包含一堆字段的模型。其中两个字段有选择。它们看起来像这样:

SNAIL_MAIL_INVOICE_CHOICES = (
    ('Y', 'Yes'),
    ('N', 'No'),
)

SNAIL_MAIL_CHOICES = (
    ('Y', 'Yes'),
    ('N', 'No'),
)

snailMailOnly = models.CharField(max_length = 3, verbose_name = 'Snail Mail Only?', choices = SNAIL_MAIL_CHOICES, default='Y')
snailMailInvoice = models.CharField(max_length = 3, verbose_name = 'Snail Mail Invoice?', choices = SNAIL_MAIL_INVOICE_CHOICES, default='Y')

当我在 Django 模板中显示这两个值时,我会这样做:

    <tr><td>Snail Mail Only?</td><td>contact.get_snailMailOnly_display</td></tr>
    <tr><td>Snail Mail Invoice?</td><td>contact.get_snailMailInvoice_display</td></tr>

问题在于,虽然第一个字段 snailMailOnly 正确显示选项 YesNo,但第二个字段 snailMailInvoice 仅显示 YN

我在这里做错了什么?

谢谢

EDIT -- 添加联系人模型代码:

class System_Contact(models.Model):
IS_MAIN_CONTACT_CHOICES = (
    ('Y', 'Yes'),
    ('N', 'No'),
)

IS_SYSTEM_OWNER_CHOICES = (
    ('Y', 'Yes'),
    ('N', 'No'),
)

IS_RESSY_CONTACT_CHOICES = (
    ('Y', 'Yes'),
    ('N', 'No, this is a commercial contact'),
)

TRADE_CHOICES = (
    ('EL', 'Electrician'),
    ('LA', 'Landscaper'),
    ('PL', 'Plumber'),
    ('TR', 'Trencher'),
)

SNAIL_MAIL_CHOICES = (
    ('Y', 'Yes'),
    ('N', 'No'),
)

SNAIL_MAIL_INVOICE_CHOICES = (
    ('Y', 'Yes'),
    ('N', 'No'),
)


firstInitial = models.CharField(max_length = 10, verbose_name = 'First Initial', blank = True, null = True)
firstName = models.CharField(max_length = 60, verbose_name = 'First Name', blank = True, null = True)
lastName = models.CharField(max_length = 160, verbose_name = 'Last Name', blank = True, null = True)
phonetically = models.CharField(max_length = 100, verbose_name = 'Phonetically', blank = True, null = True)
companyName = models.CharField (max_length = 160, verbose_name = 'Company Name', blank = True, null = True) #Only used for Commercial Owners, no other field needed
homePhone = models.CharField(max_length = 60, verbose_name = 'Home Phone Number', blank = True, null = True)
officePhone = models.CharField(max_length = 60, verbose_name = 'Office Phone Number', blank = True, null = True)
cellPhone = models.CharField(max_length = 60, verbose_name = 'Cell Phone Number', blank = True, null = True)
faxNumber = models.CharField (max_length= 60, blank=True, null=True, verbose_name = 'Fax Number')
isMainContact = models.CharField (max_length = 3, verbose_name = 'Is the Main Contact?', choices = IS_MAIN_CONTACT_CHOICES, default='N')
isRessyContact = models.CharField (max_length = 3, verbose_name = 'Is this a Ressy Contact?', choices = IS_RESSY_CONTACT_CHOICES, default='Y')

isArchived = models.BooleanField(verbose_name = 'Archived?', default = False)
systemOwner = models.CharField (max_length = 3, verbose_name = 'Is a System Owner?', choices = IS_SYSTEM_OWNER_CHOICES, default='N')  #this is just a flag to say they own a system
worksFor = models.CharField (max_length = 70, verbose_name = 'Works For', blank = True, null = True)
tradeType = models.ForeignKey(Contact_Trade, blank=True, null=True, verbose_name='Trade')
emailAddress = models.EmailField(verbose_name = 'Email Address', blank = True, null = True)

billingAddress = models.CharField(max_length = 150, verbose_name = 'Billing Address', blank=True, null=True )
billingCity = models.CharField(max_length = 90, verbose_name = 'Billing City', blank=True, null=True)
billingProvince = models.CharField(max_length = 30, verbose_name = 'Billing Province', blank=True, null=True)
billingPostalCode = models.CharField(max_length = 10, verbose_name = 'Billing Postal Code', blank=True, null=True)
snailMailOnly = models.CharField(max_length = 3, verbose_name = 'Snail Mail Only?', choices = SNAIL_MAIL_CHOICES, default='Y')
snailMailInvoice = models.CharField(max_length = 3, verbose_name = 'Snail Mail Invoice?', choices = SNAIL_MAIL_INVOICE_CHOICES, default='Y')

【问题讨论】:

发布您的contact.get_snailMailInvoice_display的代码。问题可能就在那里。 @DTing -- 添加了整个contact 模型。不确定您还在寻找什么。 get_FOO_display 是一个标准的 Django 标签。 抱歉,我的 django 有点生锈了。一定要尝试 Chris Pratt 的建议,但是您是否尝试过在模板中将 SNAIL_MAIL_INVOICE_CHOICES 替换为 SNAIL_MAIL_CHOICES 并查看重启后会发生什么?附带说明一下,可能需要考虑 DEFAULT_Y_N_CHOICES 而不是所有那些“不同”的选择? 感谢您的澄清。确实,我正在查看我第一次学习 Django 时创建的模型并畏缩。将来会有一些变化来摆脱所有这些选择字段——哎呀! 【参考方案1】:

根据您发布的代码,没有理由这样做。 'Y' 和 'N' 是否是 SNAIL_MAIL_CHOICES 的显示值?您的网络服务器可能没有提取最新的代码。

如果您正在开发中,请尝试终止 runserver (CTRL+C) 并重新启动它。

如果您在生产中,请重新启动您的网络服务器它代理的进程(如果有),例如 uwsgi。

您也可以尝试删除项目中的所有*.pyc 文件。 *nix shell 中快速简便的方法是(来自您的项目目录):

$ find . -name="*.pyc" -exec rm \;

【讨论】:

不,选择始终是“是”和“否”。我重新启动了测试服务器(尚未投入生产)并且没有任何变化。我必须说我很困惑! 请尝试 Chris Pratt 的建议。重新启动服务器不会删除预编译的 .pyc 文件。 我应该提到我还删除了 .pyc 文件,但没有任何变化——我仍然得到 YN——不是是或否。【参考方案2】:

好的——我想通了。

我意识到在我的 CSV 文件中,snailMailInvoice 字段是每一行的最后一个字段,这与事实有关。因此,在该行的末尾有一个回车符。我假设这是一个\n——因此在我导入 CSV 的 mysql 命令中,我声明了terminated by '\n'

但是,MySQL 在每一行都选择了一个 '\r' 并将其添加到 snailMailInvoice 字段中。因此,每条记录都有一个 Y 或一个带有 \rN

我将 MySQL 导入语句修改为:lines terminated with '\r\n' 现在一切正常。

经验教训。

感谢您的帮助。

【讨论】:

以上是关于Django - 选择字段显示键,而不是值的主要内容,如果未能解决你的问题,请参考以下文章

如果在下拉列表中选择了特定值,则 Django 管理员显示/隐藏字段

Django:如何在手动表单字段中显示模型的外键对象作为选择

Django为特定外键选择具有重复字段值的行

如何使用 django rest 框架在模板中获取模型选择字段名称而不是 id

从表单中的选择列表中发送值而不是键

django admin外键字段选择后如何关联显示另一个字段?