请问大家有将BlogArticleAdmin.show_author
函数内的调用换成由django.contrib.admin.filters.RelatedFieldListFilter#choices
的返回值来做的方法吗?谢谢。
admin.py
from django.contrib import admin
from django.utils.safestring import mark_safe
from .models import BlogArticle
class BlogArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'show_author', 'created_time', 'updated_time')
list_filter = ('created_time', 'author', 'updated_time')
search_fields = ('title', 'body')
date_hierarchy = 'created_time'
ordering = ['author']
readonly_fields = ('author', 'created_time', 'updated_time')
def show_author(self, obj):
return mark_safe('<a href="?author__id__exact={}">{}</a>'.format(
obj.author.pk,
obj.author.username
))
def get_queryset(self, request):
qs = super(BlogArticleAdmin, self).get_queryset(request)
if request.user.is_superuser:
return qs
return qs.filter(author=request.user)
def get_readonly_fields(self, request, obj=None):
""" 重新定义此函数,限制普通用户所能修改的字段 """
if request.user.is_superuser:
self.readonly_fields = []
return self.readonly_fields
def save_model(self, request, obj, form, change):
if getattr(obj, 'author', None) is None:
obj.author = request.user
super().save_model(request, obj, form, change)
admin.site.register(BlogArticle, BlogArticleAdmin)
models.py
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
class BlogArticle(models.Model):
title = models.CharField('标题', max_length=300)
author = models.ForeignKey(User, models.PROTECT, verbose_name='作者', related_name="blog_posts")
body = models.TextField('文章内容')
created_time = models.DateTimeField('创建于', default=timezone.now)
updated_time = models.DateTimeField('编辑于', auto_now=True)
is_delete = models.BooleanField('是否删除', default=False)
class Meta:
ordering = ("-created_time",)
def __str__(self):
return self.title