Как я могу отобразить изображение в admin.py и одно из моих полей в таблице сотрудников не отображается корректно в 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'


моя return self.first_name +self.last_name в def __str__(self) из 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 появился.

На будущее - в одной теме Question на StackOverflow размещайте только один вопрос. Многочисленные вопросы должны быть разделены на несколько тем.

Когда вы добавляете строки, они соединяются без разрыва. Использование функции 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}'

По поводу обозначения_имени. Посмотрите, что вы написали в методе __str__ в Designation модели.

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
Вернуться на верх