153 lines
4.8 KiB
Python
153 lines
4.8 KiB
Python
"""
|
||
CreatorProfile头像字段使用示例
|
||
|
||
演示如何在Django项目中使用avatar字段来处理本地图片和外部URL
|
||
"""
|
||
|
||
from django.core.files.uploadedfile import SimpleUploadedFile
|
||
from apps.daren_detail.models import CreatorProfile
|
||
from django.conf import settings
|
||
import os
|
||
|
||
def create_creator_with_local_avatar():
|
||
"""创建一个使用本地图片作为头像的创作者"""
|
||
|
||
# 方式1:通过Django admin或表单上传图片
|
||
# 用户上传图片后,Django会自动保存到 MEDIA_ROOT/avatars/ 目录
|
||
creator = CreatorProfile.objects.create(
|
||
name="张三",
|
||
category="Beauty & Personal Care",
|
||
followers=10000
|
||
)
|
||
|
||
# 假设有一个图片文件
|
||
# with open('path/to/image.jpg', 'rb') as f:
|
||
# creator.avatar.save('zhang_san.jpg', f)
|
||
|
||
print(f"创作者: {creator.name}")
|
||
print(f"头像URL: {creator.get_avatar_url()}")
|
||
|
||
return creator
|
||
|
||
def create_creator_with_external_url():
|
||
"""创建一个使用外部URL作为头像的创作者"""
|
||
|
||
creator = CreatorProfile.objects.create(
|
||
name="李四",
|
||
avatar_url="https://example.com/avatar.jpg",
|
||
category="Fashion Accessories",
|
||
followers=20000
|
||
)
|
||
|
||
print(f"创作者: {creator.name}")
|
||
print(f"头像URL: {creator.get_avatar_url()}")
|
||
|
||
return creator
|
||
|
||
def create_creator_with_both():
|
||
"""创建一个既有本地图片又有外部URL的创作者(优先使用本地图片)"""
|
||
|
||
creator = CreatorProfile.objects.create(
|
||
name="王五",
|
||
avatar_url="https://example.com/backup-avatar.jpg",
|
||
category="Sports & Outdoor",
|
||
followers=30000
|
||
)
|
||
|
||
# 如果后来上传了本地图片,会优先使用本地图片
|
||
# creator.avatar.save('wang_wu.jpg', image_file)
|
||
|
||
print(f"创作者: {creator.name}")
|
||
print(f"头像URL: {creator.get_avatar_url()}")
|
||
|
||
return creator
|
||
|
||
# API使用示例
|
||
def api_response_example():
|
||
"""API响应示例"""
|
||
|
||
# 在视图中使用序列化器
|
||
from apps.daren_detail.serializers import CreatorProfileSerializer
|
||
from django.http import HttpRequest
|
||
|
||
creator = CreatorProfile.objects.first()
|
||
|
||
# 创建一个模拟的request对象
|
||
request = HttpRequest()
|
||
request.META['HTTP_HOST'] = 'localhost:8000'
|
||
request.META['wsgi.url_scheme'] = 'http'
|
||
|
||
serializer = CreatorProfileSerializer(creator, context={'request': request})
|
||
data = serializer.data
|
||
|
||
print("API响应示例:")
|
||
print(f"名称: {data['name']}")
|
||
print(f"本地头像字段: {data.get('avatar')}")
|
||
print(f"外部头像URL: {data.get('avatar_url')}")
|
||
print(f"实际显示URL: {data.get('avatar_display_url')}")
|
||
|
||
# 前端使用示例(JavaScript)
|
||
frontend_example = """
|
||
// 前端JavaScript使用示例
|
||
|
||
// 获取创作者数据
|
||
fetch('/api/daren_detail/creators/1/')
|
||
.then(response => response.json())
|
||
.then(data => {
|
||
// 显示头像
|
||
const avatarImg = document.getElementById('avatar');
|
||
|
||
// 使用avatar_display_url字段,它会自动选择合适的URL
|
||
if (data.avatar_display_url) {
|
||
avatarImg.src = data.avatar_display_url;
|
||
avatarImg.style.display = 'block';
|
||
} else {
|
||
// 如果没有头像,显示默认头像
|
||
avatarImg.src = '/static/images/default-avatar.png';
|
||
}
|
||
|
||
// 或者可以检查具体的字段类型
|
||
if (data.avatar) {
|
||
// 这是本地上传的图片
|
||
console.log('使用本地头像:', data.avatar);
|
||
} else if (data.avatar_url) {
|
||
// 这是外部URL
|
||
console.log('使用外部头像:', data.avatar_url);
|
||
}
|
||
});
|
||
|
||
// 上传头像示例
|
||
function uploadAvatar(file, creatorId) {
|
||
const formData = new FormData();
|
||
formData.append('avatar', file);
|
||
|
||
fetch(`/api/daren_detail/creators/${creatorId}/`, {
|
||
method: 'PATCH',
|
||
body: formData,
|
||
headers: {
|
||
'X-CSRFToken': getCookie('csrftoken') // CSRF令牌
|
||
}
|
||
})
|
||
.then(response => response.json())
|
||
.then(data => {
|
||
console.log('头像上传成功:', data.avatar_display_url);
|
||
// 更新页面上的头像显示
|
||
document.getElementById('avatar').src = data.avatar_display_url;
|
||
})
|
||
.catch(error => {
|
||
console.error('头像上传失败:', error);
|
||
});
|
||
}
|
||
"""
|
||
|
||
if __name__ == "__main__":
|
||
print("CreatorProfile头像字段使用示例")
|
||
print("="*50)
|
||
print()
|
||
print("1. 支持本地图片上传到 media/avatars/ 目录")
|
||
print("2. 支持外部URL链接")
|
||
print("3. get_avatar_url() 方法优先返回本地图片URL")
|
||
print("4. 序列化器提供avatar_display_url字段用于前端显示")
|
||
print()
|
||
print("前端JavaScript示例:")
|
||
print(frontend_example) |