Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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 有条件地返回def_u str_;(self)_Django_Python 3.x - Fatal编程技术网

Django 有条件地返回def_u str_;(self)

Django 有条件地返回def_u str_;(self),django,python-3.x,Django,Python 3.x,我必须处理时间段的模型,每个国家的时间段都不同,有些时间段是BC,有些是AD。因此,我添加了一个模型时间段,其名称、开始和结束均为整数字段。由于日期不适用于公元前14000年,我想我应该将负年份定义为公元前,将正年份定义为公元前。字段的开始和结束可以为空,因为第一个期间(name='first period',start=null,end=-14000)的内容类似于:“第一个期间(公元前14000年之前)”,最后一个期间(name='last period',start=1989,end=nul

我必须处理时间段的模型,每个国家的时间段都不同,有些时间段是BC,有些是AD。因此,我添加了一个模型时间段,其名称、开始和结束均为整数字段。由于日期不适用于公元前14000年,我想我应该将负年份定义为公元前,将正年份定义为公元前。字段的开始和结束可以为空,因为第一个期间(name='first period',start=null,end=-14000)的内容类似于:“第一个期间(公元前14000年之前)”,最后一个期间(name='last period',start=1989,end=null)的内容如下:“上期(1989年至今)”

在我有限的知识范围内,我尝试修改我的模型的
\uuu str\uu
方法,首先尝试将负年份转换为正年份,并在名称中添加BC

我遇到的第二个问题是,如果没有条件试验,即使我在admin.py中有此字段,None字段也会显示为None。它适用于
列表显示
,但不适用于
返回的名称

@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})'
成为管理员:
Meiji(1868-1912)

我可以使用以下方法获得此结果:

def __str__(self):
    """String for representing the Model object."""
    return f'{self.name} ({self.start} - {self.end})'
但是,考虑这个时期没有结束日期:

name: Heisei
start: 1989
end: null
这将变成:
Heisei(1989年无)
尽管
显示为空值='
,但它似乎在
中不起作用

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

更糟糕的是,没有开始日期的时段:

name: Paleolithic
start: null
end: -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})'
def\uuuu str\uuuuuu(自):
如果self.start<0:
A=f'{abs(self.start)}BC'
elif self.start==无:
A=''
其他:
A=自启动
如果self.end<0:
B=f'{abs(self.end)}BC'
elif self.end==无:
B=“”
其他:
B=自我结束
返回f'{self.name}({A}-{B})'
但这似乎不起作用,并在runserver控制台中出现错误:


鉴于更改
\uu str\uuuuuuuuuuuuuuuuuuuuuu()
在定义开始和结束并且都是广告日期的简单情况下为您提供了所需的结果,我扩展了您的
\uuuuuu str\uuuuuuuuuuuuuuuuuu()
方法,现在为您概述的其他边缘情况提供了所需的结果:

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})'

至于,我认为这意味着在Django管理页面中显示整个空字段或模型实例
上面的方法应该很好。

当你说它不起作用时,你传递的值是什么,它显示了什么?它是否引发异常,还是仅仅显示了错误的日期?你应该清楚输入是什么,期望的输出是什么,以及你当前得到的输出是什么。谢谢你的支持指导我如何更好地表达我的问题。使用上面的代码,我在控制台文件“”第219行,在带有框架的调用文件“”第1行(abs(self.start)BC)中得到一个错误^SyntaxError:无效的SyntaxIt’这似乎很奇怪,因为该格式字符串没有给我任何语法错误。您是否可以包含尝试访问该页面时得到的完整回溯?您可以使用代码格式将其添加到代码下面。我现在编辑它是为了更好地说明问题。非常感谢您,我可能ly failed over if self.start为None:vs==None,因为Python对我来说也很新,但是您的工作补丁更整洁,因为它给了我完整的工作结果,非常感谢您对如何在这里用所有需要的信息表达问题的评论。我学到了很多,谢谢!您可以查看
==
的对比是
用于检查无。我不确定语法错误是什么,因为您发布的代码看起来应该可以工作,但我很高兴我能帮上忙!
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})'
Heisei (1989 - present)
Meiji (1868 - 1912)
Paleolithic (before 14000 BC)