如何在 admin.py 中显示图像,而我在员工 table 中的字段之一在 admin.py 中显示不正确?

How can I display image in admin.py and one of my field in employee table is not appearing correct in admin.py?

我正在创建员工监控系统。我现在有3个模型。他们在这里

class User(models.Model):
    username= models.CharField(max_length=256, verbose_name='Username')
    first_name = models.CharField(max_length=256, verbose_name='First Name')
    last_name = models.CharField(max_length=256, verbose_name='Last Name')
    email=models.EmailField(max_length=256, verbose_name='Email')

    def __str__(self):
        return self.first_name + self.last_name

class Departments(models.Model):
    department_name= models.CharField(max_length=256, verbose_name='Departments')

    def __str__(self):
        return self.department_name


class Designation(models.Model):
    department_name= models.ForeignKey(Departments, on_delete=models.CASCADE)
    designation_name=models.CharField(max_length=256, verbose_name='Designation')

    def __str__(self):
        return '{} {}'.format(self.department_name, self.designation_name)

class Employee(models.Model):
    user= models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True,)
    department_name= models.ForeignKey(Departments, on_delete=models.CASCADE)
    designation_name= models.ForeignKey(Designation, on_delete=models.CASCADE)
    salary= models.FloatField(null=False, default=0.0, verbose_name='Salary')
    image = models.ImageField(upload_to = 'employee_images', null=True, blank=True)

    def __str__(self):
        return '{} {} {}'.format(self.user.first_name + self.user.last_name, self.department_name.department_name, self.designation_name.designation_name)

    def image_tag(self):
        return mark_safe('<img src="/employee_images/%s" width="150" height="150" />' % (self.image))
    image_tag.short_description = 'Image'


my return self.first_name +self.last_name in def __str__(self) of employee table 没有给我这两个名字之间的任何差距。我不知道该怎么做。

并且我已经尝试了本网站上每个人建议的所有方法来在 admin.py 上显示图像,但我无法显示它们。这是我的 admin.py

admin.py

@admin.register(Employee)
class EmployeeAdmin(admin.ModelAdmin):
    list_display= ('first_name', 'last_name', 'designation_name', 'department', 'salary', 'image_tag')
    def first_name(self, obj):
        return obj.user.first_name
    
    def last_name(self, obj):
        return obj.user.last_name

    def designation_name(self, obj):
        return obj.designation.designation_name
    
    def department(self, obj):
        return obj.department_name.department_name


最后一件事,我的 designation_name 不仅返回了我 designation_name,还返回了 department_name。我只想designation_name出现

对于未来 - 在 Whosebug 上的一个 Question 中只包含一个问题。多个问题应该分成几个主题。

添加字符串时,它们是无缝连接的。使用 format 函数通常不是将变量插入 string 的最佳方式。您可以通过两种方式解决:

# now
def __str__(self):
    return '{} {} {}'.format(self.user.first_name + self.user.last_name, self.department_name.department_name, self.designation_name.designation_name)

# solution 1
def __str__(self):
    return '{} {} {} {}'.format(self.user.first_name, self.user.last_name, self.department_name.department_name, self.designation_name.designation_name)

# solution 2
def __str__(self):
    return f'{self.user.first_name} {self.user.last_name} {self.department_name.department_name} {self.designation_name.designation_name}'

关于designation_name。看看你在 Designation 模型的 __str__ 方法中写了什么。

class Designation(models.Model):
    ...    
    def __str__(self):
        return '{} {}'.format(self.department_name, self.designation_name)

只需将'{} {}'.format(self.department_name, self.designation_name)替换为简单的self.designation_name就可以了。

最后是管理图像。据此:https://books.agiliq.com/projects/django-admin-cookbook/en/latest/imagefield.html 您的 admin.py 可能类似于:

@admin.register(Employee)
class EmployeeAdmin(admin.ModelAdmin):

    readonly_fields = ["show_image"]
    def show_image(self, obj):
        return mark_safe('<img src="{url}" width="{width}" height={height} />'.format(
            url=obj.image.url,
            width=obj.image.width,
            height=obj.image.height,
            )
        )

    list_display= ('first_name', 'last_name', 'designation_name', 'department', 'salary', 'image')

    def first_name(self, obj):
        return obj.user.first_name
    
    def last_name(self, obj):
        return obj.user.last_name

    def designation_name(self, obj):
        return obj.designation.designation_name
    
    def department(self, obj):
        return obj.department_name.department_name