当我们使用Django后台admin管理后台时,如何根据字段名筛选不同的内容,本文将通过实例介绍如何实现,有如下两模型

class User(models.Model):

    name = models.CharField(max_length=50, verbose_name="名字")
    is_staff = models.BooleanField(default=False, verbose_name="是否管理员")


class Article(models.Model):

    author = models.ForeignKey(User, verbose_name="作者", on_delete=models.PROTECT)
    title = models.CharField(max_length=150, verbose_name="文章标题")

我们在admin.py注册两个模型

@admin.register(User)
class UserAdmin(admin.ModelAdmin):

    list_display = ("name", "is_staff")


@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):

    list_display = ("id", "title", "author")

现在我们先使用python manage.py createsuperuser创建一个超级用户,然后在进入后台创建一个普通的用户,接下来我们开始创建一篇文章

可以看到,当我们有多个用户时,会出现上图的选项,但我们只想选管理员用户时,就不是很清晰,我们可以通过修改ArticleAdmin来实现这一需求,我们可以将我们原来的ArticleAdmin修改为如下:

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):

    list_display = ("id", "title", "author")

    def formfield_for_dbfield(self, db_field, **kwargs):
      """选择文章作者时只显示superuser"""
      if db_field.name == 'author':
        kwargs['queryset'] = User.objects.filter(is_staff=True)
        return super(ArticleAdmin, self).formfield_for_dbfield(db_field, **kwargs)

修改后我们再次添加文章时,选择作者时就只会出现管理员用户了

版权声明:如无特殊说明,文章均为本站原创,转载请注明出处

本文链接:https://www.ltfred.com/article/python-admin-field/