This commit is contained in:
@@ -46,8 +46,13 @@ class OrderableAdminMixin:
|
||||
def move_up_view(self, request, object_id):
|
||||
obj = self.get_object(request, object_id)
|
||||
if obj:
|
||||
qs = self.model.objects.all()
|
||||
# 如果模型有 is_pinned 字段,则只在相同置顶状态的记录中交换
|
||||
if hasattr(obj, 'is_pinned'):
|
||||
qs = qs.filter(is_pinned=obj.is_pinned)
|
||||
|
||||
# 找到排在它前面的一个 (order 小于它的最大值)
|
||||
prev_obj = self.model.objects.filter(order__lt=obj.order).order_by('-order').first()
|
||||
prev_obj = qs.filter(order__lt=obj.order).order_by('-order').first()
|
||||
if prev_obj:
|
||||
# 交换
|
||||
obj.order, prev_obj.order = prev_obj.order, obj.order
|
||||
@@ -62,8 +67,13 @@ class OrderableAdminMixin:
|
||||
def move_down_view(self, request, object_id):
|
||||
obj = self.get_object(request, object_id)
|
||||
if obj:
|
||||
qs = self.model.objects.all()
|
||||
# 如果模型有 is_pinned 字段,则只在相同置顶状态的记录中交换
|
||||
if hasattr(obj, 'is_pinned'):
|
||||
qs = qs.filter(is_pinned=obj.is_pinned)
|
||||
|
||||
# 找到排在它后面的一个 (order 大于它的最小值)
|
||||
next_obj = self.model.objects.filter(order__gt=obj.order).order_by('order').first()
|
||||
next_obj = qs.filter(order__gt=obj.order).order_by('order').first()
|
||||
if next_obj:
|
||||
# 交换
|
||||
obj.order, next_obj.order = next_obj.order, obj.order
|
||||
@@ -202,6 +212,12 @@ class TopicAdmin(OrderableAdminMixin, ModelAdmin):
|
||||
inlines = [TopicMediaInline, ReplyInline]
|
||||
actions = ['reset_ordering']
|
||||
|
||||
def save_model(self, request, obj, form, change):
|
||||
# 当帖子被置顶时(新建或修改状态),默认将排序值设为0
|
||||
if obj.is_pinned and (not change or 'is_pinned' in form.changed_data):
|
||||
obj.order = 0
|
||||
super().save_model(request, obj, form, change)
|
||||
|
||||
@admin.action(description="重置排序 (0,1,2... 新帖子在前)")
|
||||
def reset_ordering(self, request, queryset):
|
||||
"""
|
||||
@@ -223,7 +239,7 @@ class TopicAdmin(OrderableAdminMixin, ModelAdmin):
|
||||
'description': '可关联 硬件、服务 或 课程,用于技术求助或讨论'
|
||||
}),
|
||||
('统计数据', {
|
||||
'fields': ('view_count', 'created_at', 'updated_at'),
|
||||
'fields': ('view_count', 'order', 'created_at', 'updated_at'),
|
||||
'classes': ('collapse',)
|
||||
}),
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user