Отображение унаследованного поля в 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.