我在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控制台中似乎无法正常工作并给出错误
答案 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})'
使用以下name
,start
和end
的输入值对其进行测试将得到以下输出:
'Heisei',1989,无
《明治》,1868年,1912年
'Paleolithic',无,-14000
Heisei (1989 - present)
Meiji (1868 - 1912)
Paleolithic (before 14000 BC)
对于empty_value_display,我认为这是为了在Django管理页面中显示整个空字段或模型实例。由于您希望在每个期间显示一个漂亮的自定义结果,因此我认为覆盖上述的__str__()
方法应该可以。