admin.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. from django.contrib import admin
  2. from .models import Group, Membership, Post, Comment, PostLike # <<<< 导入 PostLike
  3. class MembershipInline(admin.TabularInline):
  4. model = Membership
  5. extra = 1
  6. autocomplete_fields = ['user']
  7. class GroupAdmin(admin.ModelAdmin):
  8. list_display = ('name', 'creator', 'created_at', 'get_tags_display')
  9. list_filter = ('created_at', 'tags')
  10. search_fields = ('name', 'description', 'creator__email', 'creator__nickname')
  11. inlines = [MembershipInline]
  12. filter_horizontal = ('tags',)
  13. def get_tags_display(self, obj):
  14. return ", ".join([tag.name for tag in obj.tags.all()])
  15. get_tags_display.short_description = '相关标签'
  16. class MembershipAdmin(admin.ModelAdmin):
  17. list_display = ('user_display', 'group', 'date_joined')
  18. list_filter = ('group', 'date_joined')
  19. search_fields = ('user__email', 'user__nickname', 'group__name')
  20. autocomplete_fields = ['user', 'group']
  21. def user_display(self, obj):
  22. if hasattr(obj.user, 'display_name') and obj.user.display_name:
  23. return obj.user.display_name
  24. return obj.user.email
  25. user_display.short_description = '用户'
  26. user_display.admin_order_field = 'user__email'
  27. class PostAdmin(admin.ModelAdmin):
  28. list_display = ('title_or_author', 'group', 'author_display', 'created_at', 'short_content')
  29. list_filter = ('group', 'created_at', 'author')
  30. search_fields = ('title', 'content', 'author__email', 'author__nickname', 'group__name')
  31. autocomplete_fields = ['group', 'author']
  32. def title_or_author(self, obj):
  33. return obj.title if obj.title else f"来自 {self.author_display(obj)} 的动态"
  34. title_or_author.short_description = '标题/作者动态'
  35. def author_display(self, obj):
  36. if hasattr(obj.author, 'display_name'):
  37. return obj.author.display_name
  38. return obj.author.email
  39. author_display.short_description = '作者'
  40. author_display.admin_order_field = 'author__email'
  41. def short_content(self, obj):
  42. return obj.content[:50] + '...' if len(obj.content) > 50 else obj.content
  43. short_content.short_description = '内容预览'
  44. class CommentAdmin(admin.ModelAdmin):
  45. list_display = ('author_display_comment', 'post_identifier_comment', 'short_content_comment', 'created_at', 'updated_at')
  46. list_filter = ('created_at', 'post', 'author')
  47. search_fields = ('content', 'author__email', 'author__nickname', 'post__title')
  48. autocomplete_fields = ['post', 'author']
  49. def author_display_comment(self, obj):
  50. if hasattr(obj.author, 'display_name') and obj.author.display_name:
  51. return obj.author.display_name
  52. return obj.author.email
  53. author_display_comment.short_description = '评论作者'
  54. author_display_comment.admin_order_field = 'author__email'
  55. def post_identifier_comment(self, obj):
  56. return obj.post.title if obj.post.title else f"帖子ID: {obj.post.id}"
  57. post_identifier_comment.short_description = '所属帖子'
  58. post_identifier_comment.admin_order_field = 'post__title'
  59. def short_content_comment(self, obj):
  60. return obj.content[:75] + '...' if len(obj.content) > 75 else obj.content
  61. short_content_comment.short_description = '评论内容预览'
  62. class PostLikeAdmin(admin.ModelAdmin): # <<<< 新增 PostLikeAdmin
  63. list_display = ('user_display', 'post_identifier', 'created_at')
  64. list_filter = ('created_at', 'post__group', 'post', 'user') # 可以按小组、帖子、用户筛选
  65. search_fields = ('user__email', 'user__nickname', 'post__title')
  66. autocomplete_fields = ['user', 'post'] # 方便选择用户和帖子
  67. def user_display(self, obj):
  68. if hasattr(obj.user, 'display_name') and obj.user.display_name:
  69. return obj.user.display_name
  70. return obj.user.email
  71. user_display.short_description = '点赞用户'
  72. user_display.admin_order_field = 'user__email'
  73. def post_identifier(self, obj):
  74. return obj.post.title if obj.post.title else f"帖子ID: {obj.post.id}"
  75. post_identifier.short_description = '被点赞的帖子'
  76. post_identifier.admin_order_field = 'post__title'
  77. # 注册所有模型到Admin站点
  78. admin.site.register(Group, GroupAdmin)
  79. admin.site.register(Membership, MembershipAdmin)
  80. admin.site.register(Post, PostAdmin)
  81. admin.site.register(Comment, CommentAdmin)
  82. admin.site.register(PostLike, PostLikeAdmin) # <<<< 新增注册 PostLike