admin.py 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. from django.contrib import admin
  2. from .models import Group, Membership, Post # 导入所有需要的模型
  3. # 为 Membership 模型创建一个内联 Admin 类
  4. class MembershipInline(admin.TabularInline):
  5. model = Membership
  6. extra = 1 # 默认显示一个空的额外行,方便添加新成员
  7. autocomplete_fields = ['user'] # 假设 CustomUserAdmin 中设置了 search_fields
  8. # 为 Group 模型创建一个 Admin 类
  9. class GroupAdmin(admin.ModelAdmin):
  10. list_display = ('name', 'creator', 'created_at', 'get_tags_display')
  11. list_filter = ('created_at', 'tags')
  12. search_fields = ('name', 'description', 'creator__email', 'creator__nickname')
  13. inlines = [MembershipInline] # 将 MembershipInline 嵌入
  14. filter_horizontal = ('tags',) # 为 tags 字段使用 filter_horizontal
  15. def get_tags_display(self, obj):
  16. return ", ".join([tag.name for tag in obj.tags.all()])
  17. get_tags_display.short_description = '相关标签'
  18. # 为 Membership 模型创建一个 Admin 类 (可选,但方便单独管理)
  19. class MembershipAdmin(admin.ModelAdmin):
  20. list_display = ('user_display', 'group', 'date_joined') # 假设 CustomUser 有 display_name
  21. list_filter = ('group', 'date_joined')
  22. search_fields = ('user__email', 'user__nickname', 'group__name')
  23. autocomplete_fields = ['user', 'group']
  24. def user_display(self, obj):
  25. # 确保你的 CustomUser 模型有一个 display_name 属性或方法
  26. # 如果没有,可以直接用 obj.user.email 或 obj.user.nickname
  27. if hasattr(obj.user, 'display_name'):
  28. return obj.user.display_name
  29. return obj.user.email # 或者其他你想显示的字段
  30. user_display.short_description = '用户'
  31. user_display.admin_order_field = 'user__email'
  32. # 为 Post 模型创建一个 Admin 类
  33. class PostAdmin(admin.ModelAdmin):
  34. list_display = ('title_or_author', 'group', 'author_display', 'created_at', 'short_content')
  35. list_filter = ('group', 'created_at', 'author')
  36. search_fields = ('title', 'content', 'author__email', 'author__nickname', 'group__name')
  37. autocomplete_fields = ['group', 'author'] # 为外键启用自动完成
  38. def title_or_author(self, obj):
  39. return obj.title if obj.title else f"来自 {self.author_display(obj)} 的动态"
  40. title_or_author.short_description = '标题/作者动态'
  41. def author_display(self, obj):
  42. if hasattr(obj.author, 'display_name'):
  43. return obj.author.display_name
  44. return obj.author.email # 或者其他你想显示的字段
  45. author_display.short_description = '作者'
  46. author_display.admin_order_field = 'author__email' # 允许按作者邮箱排序
  47. def short_content(self, obj):
  48. return obj.content[:50] + '...' if len(obj.content) > 50 else obj.content
  49. short_content.short_description = '内容预览'
  50. # PostAdmin 类定义到此结束
  51. # 注册所有模型到Admin站点
  52. admin.site.register(Group, GroupAdmin)
  53. admin.site.register(Membership, MembershipAdmin)
  54. admin.site.register(Post, PostAdmin) # PostAdmin 的注册现在在类定义之后