finish
This commit is contained in:
@@ -37,7 +37,7 @@ class ActivityAdmin(ModelAdmin):
|
|||||||
|
|
||||||
fieldsets = (
|
fieldsets = (
|
||||||
('基本信息', {
|
('基本信息', {
|
||||||
'fields': ('title', 'description', 'banner', 'is_active')
|
'fields': ('title', 'description', 'banner', 'banner_url', 'is_active')
|
||||||
}),
|
}),
|
||||||
('时间与地点', {
|
('时间与地点', {
|
||||||
'fields': ('start_time', 'end_time', 'location'),
|
'fields': ('start_time', 'end_time', 'location'),
|
||||||
@@ -52,6 +52,8 @@ class ActivityAdmin(ModelAdmin):
|
|||||||
def banner_display(self, obj):
|
def banner_display(self, obj):
|
||||||
if obj.banner:
|
if obj.banner:
|
||||||
return format_html('<img src="{}" height="50" style="border-radius: 4px;" />', obj.banner.url)
|
return format_html('<img src="{}" height="50" style="border-radius: 4px;" />', obj.banner.url)
|
||||||
|
elif obj.banner_url:
|
||||||
|
return format_html('<img src="{}" height="50" style="border-radius: 4px;" />', obj.banner_url)
|
||||||
return "暂无"
|
return "暂无"
|
||||||
|
|
||||||
@display(description="报名人数")
|
@display(description="报名人数")
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
# Generated by Django 6.0.1 on 2026-02-11 07:00
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('community', '0003_alter_reply_content_alter_topic_content_topicmedia'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='activity',
|
||||||
|
name='banner_url',
|
||||||
|
field=models.URLField(blank=True, help_text='可直接填写图片链接,若同时上传图片,将优先显示上传的图片', null=True, verbose_name='活动Banner链接'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='activity',
|
||||||
|
name='banner',
|
||||||
|
field=models.ImageField(blank=True, null=True, upload_to='activities/banners/', verbose_name='活动Banner图'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -7,7 +7,8 @@ class Activity(models.Model):
|
|||||||
"""
|
"""
|
||||||
title = models.CharField(max_length=100, verbose_name="活动标题")
|
title = models.CharField(max_length=100, verbose_name="活动标题")
|
||||||
description = models.TextField(verbose_name="活动详情")
|
description = models.TextField(verbose_name="活动详情")
|
||||||
banner = models.ImageField(upload_to='activities/banners/', verbose_name="活动Banner图")
|
banner = models.ImageField(upload_to='activities/banners/', verbose_name="活动Banner图", null=True, blank=True)
|
||||||
|
banner_url = models.URLField(verbose_name="活动Banner链接", null=True, blank=True, help_text="可直接填写图片链接,若同时上传图片,将优先显示上传的图片")
|
||||||
start_time = models.DateTimeField(verbose_name="开始时间")
|
start_time = models.DateTimeField(verbose_name="开始时间")
|
||||||
end_time = models.DateTimeField(verbose_name="结束时间")
|
end_time = models.DateTimeField(verbose_name="结束时间")
|
||||||
location = models.CharField(max_length=100, verbose_name="活动地点")
|
location = models.CharField(max_length=100, verbose_name="活动地点")
|
||||||
@@ -15,6 +16,24 @@ class Activity(models.Model):
|
|||||||
is_active = models.BooleanField(default=True, verbose_name="是否启用")
|
is_active = models.BooleanField(default=True, verbose_name="是否启用")
|
||||||
created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
|
created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
|
||||||
|
|
||||||
|
def clean(self):
|
||||||
|
from django.core.exceptions import ValidationError
|
||||||
|
if not self.banner and not self.banner_url:
|
||||||
|
raise ValidationError("Banner图片和Banner链接必须至少填写一项")
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
self.clean()
|
||||||
|
super().save(*args, **kwargs)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def display_banner_url(self):
|
||||||
|
"""
|
||||||
|
获取Banner显示的URL,优先使用上传的图片
|
||||||
|
"""
|
||||||
|
if self.banner:
|
||||||
|
return self.banner.url
|
||||||
|
return self.banner_url
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.title
|
return self.title
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ from .models import Activity, ActivitySignup, Topic, Reply, TopicMedia
|
|||||||
from shop.serializers import WeChatUserSerializer, ESP32ConfigSerializer, ServiceSerializer, VCCourseSerializer
|
from shop.serializers import WeChatUserSerializer, ESP32ConfigSerializer, ServiceSerializer, VCCourseSerializer
|
||||||
|
|
||||||
class ActivitySerializer(serializers.ModelSerializer):
|
class ActivitySerializer(serializers.ModelSerializer):
|
||||||
|
display_banner_url = serializers.ReadOnlyField()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Activity
|
model = Activity
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user