结合上面的问题,如何在过滤后改变list_display中展示的字段,其中包括数据库没有的字段
时间: 2024-02-03 10:14:55 浏览: 131
可以通过定义一个函数来实现展示数据库没有的字段。具体步骤如下:
1. 在模型的admin.py文件中,定义一个函数,用于展示需要显示的字段。例如:
```python
from django.contrib import admin
from .models import MyModel
class MyModelAdmin(admin.ModelAdmin):
list_display = ('id', 'name', 'email', 'custom_field')
def custom_field(self, obj):
return obj.some_field + obj.another_field
custom_field.short_description = 'Custom Field'
```
上述代码中,我们定义了一个函数`custom_field`,它返回`obj.some_field`和`obj.another_field`的和,用于展示一个自定义的字段。
2. 将这个函数添加到`list_display`列表中,以便在admin界面中展示出来。
3. 运行django项目,打开admin界面,就可以看到展示了我们自定义的字段`Custom Field`了。
需要注意的是,如果自定义的字段需要进行排序或过滤,还需要定义相应的函数来实现。
相关问题
结合上面的问题,如何在过滤后改变list_display中展示的字段,其中包括数据库没有的字段,同时改变查询内容结果
如果要在`list_display`中展示数据库没有的字段,可以使用`@property`装饰器将这些字段定义为模型的属性。然后在`list_display`中引用这些属性即可。
例如,假设你有一个`Person`模型,但是想要在`list_display`中展示该人的年龄(从生日计算得出),可以这样做:
```python
from datetime import date
class Person(models.Model):
name = models.CharField(max_length=50)
birthday = models.DateField()
@property
def age(self):
today = date.today()
return today.year - self.birthday.year - ((today.month, today.day) < (self.birthday.month, self.birthday.day))
class Meta:
verbose_name = 'person'
verbose_name_plural = 'people'
@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
list_display = ('name', 'age')
```
在这个例子中,我们定义了一个`age`属性,它通过计算生日和当前日期来计算该人的年龄。然后我们在`PersonAdmin`的`list_display`中引用了这个属性。
如果你想改变查询内容结果,可以使用`ModelAdmin`的`get_queryset`方法。你可以在这个方法中对原始查询集进行过滤、排序、分组等操作,然后返回一个新的查询集。
例如,假设你只想查询年龄大于等于18岁的人,可以这样做:
```python
@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
list_display = ('name', 'age')
def get_queryset(self, request):
qs = super().get_queryset(request)
today = date.today()
adult_age = today.year - 18 - ((today.month, today.day) < (self.birthday.month, self.birthday.day))
return qs.filter(birthday__lte=date(today.year - adult_age, today.month, today.day))
```
在这个例子中,我们在`get_queryset`方法中计算出当前年龄大于等于18岁的日期,然后使用`filter`方法过滤出生日在这个日期之前的人。然后我们返回这个新的查询集。
结合上面的问题,如何在过滤后改变list_display中展示的字段
可以定义一个方法,将需要展示的字段进行处理后返回,然后将这个方法名添加到`list_display`中。
例如,假设我们有一个名为`Book`的模型,其中有`title`、`author`、`publish_date`和`is_published`等字段,我们想要在`list_display`中展示`title`、`author`和`publish_date`字段,并且将`publish_date`字段格式化为`YYYY-MM-DD`的形式。那么我们可以这样做:
```python
from django.utils import timezone
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'author_name', 'formatted_publish_date')
def author_name(self, obj):
return obj.author.name
def formatted_publish_date(self, obj):
return timezone.localtime(obj.publish_date).strftime('%Y-%m-%d')
author_name.short_description = 'Author'
formatted_publish_date.short_description = 'Publish Date'
admin.site.register(Book, BookAdmin)
```
在上面的代码中,我们定义了两个方法`author_name`和`formatted_publish_date`,分别用于展示`author`和`publish_date`字段。在`author_name`方法中,我们从`obj`参数中获取`Book`对象,然后返回它的`author`字段的`name`属性。在`formatted_publish_date`方法中,我们将`obj`参数中的`publish_date`字段的值转换为本地时间,并将其格式化为`YYYY-MM-DD`的形式。
然后,我们将这两个方法的名称添加到`list_display`中,并将其命名为`Author`和`Publish Date`。这样,我们就可以在`Book`模型的管理页面中看到`title`、`author`和`publish_date`字段,并且`publish_date`字段的格式已经被处理成了`YYYY-MM-DD`的形式。
阅读全文