From de1e409447886d90c94967e6087d0109eef2c9b2 Mon Sep 17 00:00:00 2001 From: jeremygan2021 Date: Tue, 17 Mar 2026 19:21:32 +0800 Subject: [PATCH] admin phone serch --- backend/community/admin.py | 8 ++++---- .../migrations/0003_alter_activity_author.py | 20 +++++++++++++++++++ backend/community/models.py | 2 +- backend/shop/admin.py | 8 ++++---- backend/shop/models.py | 2 +- 5 files changed, 30 insertions(+), 10 deletions(-) create mode 100644 backend/community/migrations/0003_alter_activity_author.py diff --git a/backend/community/admin.py b/backend/community/admin.py index b4f940f..1558961 100644 --- a/backend/community/admin.py +++ b/backend/community/admin.py @@ -122,7 +122,7 @@ class OrderableAdminMixin: class ActivityAdmin(ModelAdmin): list_display = ('title', 'author', 'banner_display', 'start_time', 'location', 'signup_count', 'is_visible', 'is_active', 'auto_confirm', 'created_at') list_filter = ('is_visible', 'is_active', 'auto_confirm', 'start_time') - search_fields = ('title', 'location') + search_fields = ('title', 'location', 'author__phone_number') # autocomplete_fields = ['author'] # 暂时注释,避免环境不一致导致报错 raw_id_fields = ('author',) inlines = [ActivitySignupInline] @@ -157,7 +157,7 @@ class ActivityAdmin(ModelAdmin): class ActivitySignupAdmin(ModelAdmin): list_display = ('activity', 'user', 'signup_time', 'status_label', 'order_link') list_filter = ('status', 'signup_time', 'activity') - search_fields = ('user__nickname', 'activity__title') + search_fields = ('user__nickname', 'user__phone_number', 'activity__title') autocomplete_fields = ['activity', 'user'] actions = [export_signups_csv, export_signups_excel] @@ -211,7 +211,7 @@ class ActivitySignupAdmin(ModelAdmin): class TopicAdmin(OrderableAdminMixin, ModelAdmin): list_display = ('title', 'status', 'category', 'author', 'get_related_item', 'reply_count', 'view_count', 'is_pinned', 'created_at', 'order_actions') list_filter = ('status', 'category', 'is_pinned', 'created_at', 'related_product', 'related_service', 'related_course') - search_fields = ('title', 'content', 'author__nickname') + search_fields = ('title', 'content', 'author__nickname', 'author__phone_number') autocomplete_fields = ['author', 'related_product', 'related_service', 'related_course'] filter_horizontal = ('likes',) inlines = [TopicMediaInline, ReplyInline] @@ -279,7 +279,7 @@ class TopicAdmin(OrderableAdminMixin, ModelAdmin): class ReplyAdmin(ModelAdmin): list_display = ('short_content', 'topic', 'author', 'is_pinned', 'like_count', 'created_at') list_filter = ('is_pinned', 'created_at') - search_fields = ('content', 'author__nickname', 'topic__title') + search_fields = ('content', 'author__nickname', 'author__phone_number', 'topic__title') autocomplete_fields = ['author', 'topic', 'reply_to'] filter_horizontal = ('likes',) list_editable = ('is_pinned',) diff --git a/backend/community/migrations/0003_alter_activity_author.py b/backend/community/migrations/0003_alter_activity_author.py new file mode 100644 index 0000000..3b687ee --- /dev/null +++ b/backend/community/migrations/0003_alter_activity_author.py @@ -0,0 +1,20 @@ +# Generated by Django 6.0.1 on 2026-03-17 11:11 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('community', '0002_activity_author'), + ('shop', '0039_vccourse_video_embed_code'), + ] + + operations = [ + migrations.AlterField( + model_name='activity', + name='author', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='activities', to='shop.wechatuser', to_field='phone_number', verbose_name='发布者'), + ), + ] diff --git a/backend/community/models.py b/backend/community/models.py index 0201a62..e8a1800 100644 --- a/backend/community/models.py +++ b/backend/community/models.py @@ -18,7 +18,7 @@ class Activity(models.Model): is_paid = models.BooleanField(default=False, verbose_name="是否收费") price = models.DecimalField(max_digits=10, decimal_places=2, default=0, verbose_name="报名费用") - author = models.ForeignKey(WeChatUser, on_delete=models.SET_NULL, related_name='activities', verbose_name="发布者", null=True, blank=True) + author = models.ForeignKey(WeChatUser, to_field='phone_number', on_delete=models.SET_NULL, related_name='activities', verbose_name="发布者", null=True, blank=True) is_active = models.BooleanField(default=True, verbose_name="是否启用") is_visible = models.BooleanField(default=True, verbose_name="是否显示", help_text="关闭后将不在前端列表页显示") diff --git a/backend/shop/admin.py b/backend/shop/admin.py index 4b800b8..b26ec1c 100644 --- a/backend/shop/admin.py +++ b/backend/shop/admin.py @@ -385,7 +385,7 @@ class SalespersonAdmin(ModelAdmin): class CommissionLogAdmin(ModelAdmin): list_display = ('id', 'salesperson', 'distributor', 'amount', 'level', 'status', 'created_at') list_filter = ('status', 'level', 'salesperson', 'distributor', 'created_at') - search_fields = ('salesperson__name', 'distributor__user__nickname', 'order__id') + search_fields = ('salesperson__name', 'distributor__user__nickname', 'distributor__user__phone_number', 'order__id') readonly_fields = ('amount', 'level', 'created_at') fieldsets = ( @@ -482,7 +482,7 @@ class ProductTypeFilter(admin.SimpleListFilter): class OrderAdmin(ModelAdmin): list_display = ('id', 'customer_name', 'get_item_name', 'total_price', 'status', 'salesperson', 'distributor', 'created_at') list_filter = ('status', ProductTypeFilter, 'config', 'course', 'activity', PriceRangeFilter, 'salesperson', 'distributor', 'created_at') - search_fields = ('id', 'customer_name', 'phone_number', 'wechat_trade_no') + search_fields = ('id', 'customer_name', 'phone_number', 'wechat_trade_no', 'wechat_user__phone_number') readonly_fields = ('total_price', 'created_at', 'wechat_trade_no') actions = [export_to_csv, export_to_excel] @@ -569,7 +569,7 @@ class WeChatUserAdmin(OrderableAdminMixin, ModelAdmin): @admin.register(Distributor) class DistributorAdmin(ModelAdmin): list_display = ('get_nickname', 'level', 'status', 'total_earnings', 'withdrawable_balance', 'invite_code', 'created_at') - search_fields = ('user__nickname', 'invite_code') + search_fields = ('user__nickname', 'user__phone_number', 'invite_code') list_filter = ('status', 'level', 'created_at') readonly_fields = ('total_earnings', 'withdrawable_balance', 'qr_code_url', 'created_at', 'updated_at') autocomplete_fields = ['user', 'parent'] @@ -598,7 +598,7 @@ class DistributorAdmin(ModelAdmin): class WithdrawalAdmin(ModelAdmin): list_display = ('get_distributor', 'amount', 'status', 'created_at') list_filter = ('status', 'created_at') - search_fields = ('distributor__user__nickname',) + search_fields = ('distributor__user__nickname', 'distributor__user__phone_number') def get_distributor(self, obj): return obj.distributor.user.nickname diff --git a/backend/shop/models.py b/backend/shop/models.py index 75f9eaf..bfdf2c9 100644 --- a/backend/shop/models.py +++ b/backend/shop/models.py @@ -41,7 +41,7 @@ class WeChatUser(models.Model): self.order = self.pk def __str__(self): - return self.nickname or self.openid + return self.phone_number or self.nickname or self.openid class Meta: verbose_name = "微信用户"