Django 3.2.5 только для чтения DateTimeField

Я пытаюсь добиться отображения даты создания модели в администрировании Django, но каждый раз, когда я использую auto_now_add, она исчезает из представления пользователя (суперпользователя)

В models.py:

class Project(models.Model):
readonly_fields=('creation_date', 'modified')
project_id = models.UUIDField(
     primary_key = True,
     default = uuid.uuid4,
     editable = False)
name = models.CharField(max_length=200)
description = models.TextField(blank=True)
brand = models.ForeignKey(Brand, on_delete=models.CASCADE)
creation_date = models.DateTimeField(auto_now_add=datetime.now) #This is what I want to show
modified = models.DateTimeField(auto_now=datetime.now)          #I also want to show this one
start_date = models.DateField(blank=True, null=True)

# Orders the projects by date
class Meta:
    ordering = ['start_date']


def __str__(self):
    return '{} - {}'.format(self.brand.customer.name, self.name)

The auto_now=… [Django-doc] and auto_now_add=… [Django-doc] expects booleans, so True, not datetime.now, but since a function has by default truthiness True, that will also work.

Следствие auto_now=True или auto_now_add=True подразумевает, что editable=… [Django-doc] также установлено False, а это означает, что по умолчанию поля больше нет ни в ModelForm, ни в админке.

Однако вы можете явно перечислить элемент как поле в readonly_fields атрибуте [Django-doc], чтобы обеспечить его отображение, так:

from django.contrib import admin


@admin.register(Project)
class ProjectAdmin(admin.ModelAdmin):
    fields = (
        'name',
        'description',
        'brand',
        'creation_date',
        'modified',
        'start_date',
    )
    readonly_fields = ('creation_date', 'modified')

Вы также можете сделать это в файле admin.py, get_readonly_fields на модели, зарегистрированной для показа полей только для чтения. Вы можете сослаться здесь и вот пример

from django.contrib import admin
from yourApp.models import Project

class ProjectAdmin(admin.ModelAdmin):
    
    def get_readonly_fields(self, request, obj=None):
        if request.user.is_superuser:
            # Should return ('created_at', 'created_by') from Project model
            return super().get_readonly_fields(request, obj)
        else:
            """
             Add read only fields that you want none superusers
             to read or just return none if not needed
            """
            return ('field_2', 'filed_2',...)

admin.site.register(Project, ProjectAdmin)
Вернуться на верх