Отображение унаследованного поля в Django 4.0 с помощью ModelAdmin

ищу Ярешение, но считаю, что делаю что-то не так, или в Django 4 все по-другому. В created_at и updated_atполя не отображаются в админке. Я не знаю, что пропускаю.

Родительский класс

      class TimeStampMixin(models.Model):
  class Meta:
      abstract = True
  created_at = models.DateTimeField(auto_now_add=True)
  updated_at = models.DateTimeField(auto_now=True)

  def __str__(self) -> str:
      return f'{self.created_at} - {self.updated_at}'

Класс, унаследованный от TimeStampMixin

      class Post(TimeStampMixin):
    STATUS_CHOICES = (
        ('draft', 'Draft'),
        ('published', 'Published'),
    )
    title = models.CharField(max_length=200)
    body = models.TextField()
    category = models.ForeignKey('Category', on_delete=models.SET_NULL, null=True)
    # tags = models.ManyToManyField('Tag')
    tags = TaggableManager()
    objects = models.Manager() # The default manager.
    slug = models.SlugField(max_length=250,
                            unique_for_date='publish')
    author = models.ForeignKey(User,
                              on_delete=models.CASCADE,
                              related_name='blog_posts')
    publish = models.DateTimeField(default=timezone.now)
    status = models.CharField(max_length=10,
                              choices=STATUS_CHOICES,
                              default='draft')
    
    published = PublishedManager() # Our custom manager.


    class Meta:
        ordering = ('-publish',)
        
    def __str__(self):
        return self.title
    
    def get_absolute_url(self):
        return reverse('blog:post_detail',
                        args=[self.publish.year,
                                self.publish.month,
                                self.publish.day, self.slug])

спецификация администратора в admin.py файл

      @admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ('title', 'slug', 'author', 'publish', 'status', 'created_at', 'updated_at')
    list_filter = ('status', 'created_at', 'publish', 'author')
    search_fields = ('title', 'body')
    prepopulated_fields = {'slug': ('title',)}
    raw_id_fields = ('author',)
    date_hierarchy = 'publish'
    ordering = ('status', 'publish')

результат

2 ответа

Проблема в том, что ваш created_atа также updated_atдолжно быть readonly_fields. Попробуйте следующее

      @admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ('created_at', 'updated_at')
    # your code
    readonly_fields = ('created_at', 'updated_at')

Это будет работать

Это то, что вы должны сделать, а затем применить миграции, прежде чем добавить модель Perent в admin.py.

      class TimeStampMixin(models.Model):
      created_at = models.DateTimeField(auto_now_add=True)
      updated_at = models.DateTimeField(auto_now=True)
      
      class Meta:
            abstract = True
      def __str__(self):
          return f'{self.created_at} - {self.updated_at}'

А еще лучше просто добавить поле даты и времени в свою дочернюю модель, поскольку вы не добавляете родителя в администратора, я думаю, это должно работать. Итак, вы можете сделать что-то вроде этого. Это просто альтернативный пример..

      class Post(TimeStampMixin):
    STATUS_CHOICES = (
        ('draft', 'Draft'),
        ('published', 'Published'),
    )
    title = models.CharField(max_length=200)
    body = models.TextField()
    category = models.ForeignKey('Category', on_delete=models.SET_NULL, null=True)
    # tags = models.ManyToManyField('Tag')
    tags = TaggableManager()
    objects = models.Manager() # The default manager.
    slug = models.SlugField(max_length=250,
                            unique_for_date='publish')
    author = models.ForeignKey(User,
                              on_delete=models.CASCADE,
                              related_name='blog_posts')
    publish = models.DateTimeField(default=timezone.now)
    status = models.CharField(max_length=10,
                              choices=STATUS_CHOICES,
                              default='draft')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    
    published = PublishedManager() # Our custom manager.
Другие вопросы по тегам