【问题标题】:Django model field isn't showing up correctly in the django adminDjango 模型字段未在 django 管理员中正确显示
【发布时间】:2017-05-08 16:19:36
【问题描述】:

PtoHistory 模型:

class PtoHistory(models.Model):
    LEAVE_CHOICES = (
        (True, 'PTO'), #is chargeable?
        (False, 'Jury Duty'), #is chargeable?
        (False, 'Voting'), #is chargeable?
        (False, 'Military Leave'), #is chargeable?
        (False, 'Bereavement'), #is chargeable?
        (True, 'Emergency'), #is chargeable?
    )

    user = models.ForeignKey(User, on_delete=models.CASCADE)
    leave_start_date = models.DateTimeField(auto_now=False, auto_now_add=False)
    leave_end_date = models.DateTimeField(auto_now=False, auto_now_add=False)
    leave_type = models.BooleanField(choices=LEAVE_CHOICES)

    def __str__(self):
        return self.user.username

问题:

每当我将 django 管理员中的“leave_type”更改为“紧急”时,它都会在 django 管理员中显示为“PTO”,因为它们都是 True,但 PTO 首先出现在元组中,所以它在 django 管理员中显示“PTO”。所有为 False 的选项都会发生同样的事情。如果选择并保存“军事休假”,当在 django 管理员中查看时,它会显示为“陪审团职责”,因为“陪审团职责”是元组中的第一个错误。

dango admin pic

我想要发生的事情:

如果用户选择“丧亲之痛”,我希望“丧亲之痛”作为所选选项显示在 django 管理员中,并且我希望它对应于 False 值,这意味着它不会计入员工的 PTO小时。

我希望我想要的输出得到理解,如果需要,我可以提供更多说明或编码 sn-ps。老实说,我什至不知道我是否以正确的方式去做。因此,如果我需要以任何方式重组我的模型,我将不胜感激。

睡在上面之后,我认为 python 字典将是解决这个问题的好方法,我可以保存键/值对,但我不知道 django 模型字段类型“字典”。

【问题讨论】:

    标签: django django-models django-admin


    【解决方案1】:

    您可以将其设为CharField,这样您的用户就可以更简单地选择Live Type的方式,就像这样。

    class PtoHistory(models.Model):
        LEAVE_CHOICES = (
            ('pto', 'PTO'), #is chargeable?
            ('jury duty', 'Jury Duty'), #is chargeable?
            ('voting', 'Voting'), #is chargeable?
            ('military leave', 'Military Leave'), #is chargeable?
            ('bereavement', 'Bereavement'), #is chargeable?
            ('emergency', 'Emergency'), #is chargeable?
        )
    
        user = models.ForeignKey(User, on_delete=models.CASCADE)
        leave_start_date = models.DateTimeField(auto_now=False, auto_now_add=False)
        leave_end_date = models.DateTimeField(auto_now=False, auto_now_add=False)
        leave_type = models.CharField(max_length=225, choices=LEAVE_CHOICES)
    
        def __str__(self):
            return self.user.username
    

    我会定义 LEAVE_CHOICE 外部模型,然后在你的 forms.py 中定义单选按钮小部件,你有类似的东西 here

    LEAVE_CHOICES = (
            (True, 'PTO'), #is chargeable?
            (False, 'Jury Duty'), #is chargeable?
            (False, 'Voting'), #is chargeable?
            (False, 'Military Leave'), #is chargeable?
            (False, 'Bereavement'), #is chargeable?
            (True, 'Emergency'), #is chargeable?
        )
    
    class PtoHistory(models.Model):
        user = models.ForeignKey(User, on_delete=models.CASCADE)
        leave_start_date = models.DateTimeField(auto_now=False, auto_now_add=False)
        leave_end_date = models.DateTimeField(auto_now=False, auto_now_add=False)
        leave_type = models.BooleanField(choices=LEAVE_CHOICES)
    
        def __str__(self):
            return self.user.username
    

    forms.py

    class PtoHistoryModelForm(forms.ModelForm):
        class Meta:
            model = MyModel
            fields = ['leave_start_data', 'leave_end_data', 'leave_type']
            widgets = {
                'leave_type': forms.RadioSelect
            }
    

    【讨论】:

    • 感谢您的回复@PetarP。我如何让每个休假类型对应一个真值或假值?这可能吗?我现在拥有它的方式,用户会获得一个下拉列表的选择,所以你的解决方案并没有真正改变他们在前端与之交互的方式。
    • 仅与boolean 字段相关,这里有一个example,说明如何在forms.py 中使用RadioSelect 小部件
    • 您的无线电小部件建议没有达到问题中“我想要发生的事情”中所述的预期效果。如果我选择“紧急”,它仍然在 django 管理员中显示为“PTO”。唯一的区别是下拉选择菜单与单选小部件。
    • 你应该更多地尝试这个,我认为你boolean 不正确,我可以稍后尝试变出一些东西。我会用第一个例子,因为它更简单,如果我理解正确,你想看看为什么有人缺席
    • 是的,这是正确的。即使用户选择“紧急”,它在 django 管理员中显示为“PTO”,因为“PTO”是选择元组中的第一个 True 值。如果您想尝试一下,这里是 github 上的项目。 github.com/FlashBanistan/Django-PTO_APP
    最近更新 更多