首页 > 解决方案 > Dango admin 在调用 __str__ 方法时抛出空异常

问题描述

我正在使用 Django (2.2) 开发一个网络应用程序。我有以下 Profile 模型通过一对一的关系扩展了内置的 User 模型。

class Profile(models.Model):
    class Meta:
        ordering = ['user__last_name']

    txt = models.CharField("TXT", max_length=5, null=True, blank=True, unique=True)
    user = models.OneToOneField(User, on_delete=models.PROTECT)
    colleague = models.ForeignKey('self', on_delete=models.PROTECT, null=True, blank=True)

    def __str__(self):
        """ Display of User with its full name"""
        return "%s %s" % (self.user.last_name.upper(), self.user.first_name.capitalize())

__str__ 方法在管理列表显示视图或 Django shell 中运行良好。但是,当我尝试访问管理表单时抛出异常,指向 __str__ 方法但没有任何细节。

删除 __str__ 方法后,表单将正确显示。

这是模型管理员

class ProfileAdmin(admin.ModelAdmin):
    readonly_fields = ('get_last_name','get_first_name',)

    fieldsets = [
        ('User', 
         {'fields': ['get_last_name', 'get_first_name','txt', 'colleague']}),
    ]
    #Sélection des champs à afficher dans la vue liste
    list_display = ('__str__','get_poste','txt', 'colleague ')

    #Champ de recherche
    search_fields = ['user__first_name',
                     'user__last_name',
                     ]

    #calculate fields for list_display
    def get_last_name(self, obj):
        return obj.user.last_name
    def get_first_name(self, obj):
        return obj.user.first_name

    #Define description of fields for list_display
    get_last_name.short_description = 'Name'
    get_first_name.short_description = 'Firstname'

    #Enable sorting on calculated fields
    get_last_name.admin_order_field = 'user__last_name'
    get_first_name.admin_order_field = 'user__first_name'

任何解决此问题的建议将不胜感激

标签: djangodjango-admin

解决方案


这是因为该对象还没有 a first_namelast_name因此您正在调用null.upper()and null.capitalize()。尝试在__str__ 函数内部处理它。


推荐阅读