有条件地返回def __str __(self)

时间:2018-10-07 18:09:03

标签: django

我在Django和Python上还是一个新手,这实际上是我尝试启动的第一个应用程序。我可以逐步解决问题,但是当事情超出教程中提供的默认值时,我就会陷入困境。这是我的问题:

我必须处理一个时间段模型,每个国家/地区的时间段都不相同,某些时间段是BC,有些时间段是AD。因此,我添加了一个模型Period,其名称,开始和结束均为整数字段。由于日期无法用于14000BC,因此我认为我将负年份定义为BC,将正年份定义为AD。字段开始和结束可以为空,因为第一个句点(name ='First period',start = null,end = -14000)类似于:“第一个句点(14000 BC之前)”和最后一个句点(name =“最后一个时间”,开始= 1989,结束=空)将显示为:“最后一个时间(1989年至今)”

由于我的知识有限,我尝试了def str (自我):我的模型:首先尝试将负年转换为正年,并在名称中添加了BC。

我遇到的第二个问题是,没有条件试验,即使我在admin.py中也没有显示,无字段显示为“无”,很好,它适用于list_display但不适用于def str < / strong>(自己)

@admin.register(Period)
class PeriodAdmin(admin.ModelAdmin):
    list_display = ('name', 'country', 'start', 'end')
    empty_value_display = '' # seems not to work on def __str__(self):!

这是我在models.py中的模型,这在我的控制台中引发了错误

class Period(models.Model):
    country = models.ForeignKey('Country', on_delete=models.CASCADE, null=True)
    name = models.CharField(max_length=100, blank=True, null=True)
    ## use negative values for before start and end dates prior to BC and positive for AD
    start = models.IntegerField(blank=True, null=True)
    end = models.IntegerField(blank=True, null=True)

    def __str__(self):
        if self.start < 0:
            A = f'{abs(self.start)} BC'
        elif self.start == None:
            A = ''
        else:
            A = self.start
        if self.end < 0:
            B = f'{abs(self.end)} BC'
        elif self.end == None:
            B = ''
        else:
            B = self.end
        return f'{self.name} ({A} - {B})'

所以我想要实现的是:

名称:明治 开始于:1868 结束:1912年

成为管理员:明治(1868-1912)

我可以使用

def __str__(self):
    """String for representing the Model object."""
    return f'{self.name} ({self.start} - {self.end})'

但是请考虑这个时期(无结束日期) 名称:平成 开始于:1989 结束:空

那将变成:Heisei(1989-None)(尽管empty_value_display =''#似乎不适用于def str (self):!)

我想在这里:平成(1989年至今)

更糟糕的是,在卑诗省之前。

名称:旧石器时代 开始:null 结束:-14000

这将成为旧石器时代(无-14000),但我想要:旧石器时代(公元前14000年之前)

我试图使用一些逻辑

    def __str__(self):
        if self.start < 0:
            A = f'{abs(self.start)} BC'
        elif self.start == None:
            A = ''
        else:
            A = self.start
        if self.end < 0:
            B = f'{abs(self.end)} BC'
        elif self.end == None:
            B = ''
        else:
            B = self.end
        return f'{self.name} ({A} - {B})'

但这会导致错误,并且在runserver控制台中似乎无法正常工作并给出错误

Error screen

1 个答案:

答案 0 :(得分:1)

鉴于更改__str__()可以在定义开始和结束且均为AD日期的简单情况下为您提供所需的结果,所以我扩展了__str__()方法,现在可以提供所需的结果对于您概述的其他边缘情况:

def __str__(self):
    if self.start is None:
        start = 'before'
    elif self.start < 0:
        start = f'{-self.start} BC -'
    else:
        start = f'{self.start} -'
    if self.end is None:
        end = 'present'
    elif self.end < 0:
        end = f'{-self.end} BC'
    else:
        end = f'{self.end}'
    return f'{self.name} ({start} {end})'

使用以下namestartend的输入值对其进行测试将得到以下输出:

'Heisei',1989,无
《明治》,1868年,1912年
'Paleolithic',无,-14000

Heisei (1989 - present)
Meiji (1868 - 1912)
Paleolithic (before 14000 BC)

对于empty_value_display,我认为这是为了在Django管理页面中显示整个空字段或模型实例。由于您希望在每个期间显示一个漂亮的自定义结果,因此我认为覆盖上述的__str__()方法应该可以。