You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django:如何在模板中展示用户昵称及关联的全部视频文件

搞定用户昵称+视频列表展示的完整方案

嘿,我来帮你捋清楚怎么实现这个需求!你已经有了和User一对一关联的Profile模型,还有关联User的VideoFile模型,要在模板里展示用户的nickname以及他的所有视频文件,对吧?我从视图到模板给你分步说明:


先补全必要的模型细节(你没贴全VideoFile,我按常规写法补)

首先确保你的VideoFile模型有正确关联User的外键,最好加上related_name方便反向查询:

# 在你的models.py里补全VideoFile
class VideoFile(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='videos')
    video_file = models.FileField(upload_to='videos/')  # 存储视频文件
    title = models.CharField(max_length=100, blank=True)  # 可选:视频标题
    upload_time = models.DateTimeField(auto_now_add=True)  # 可选:上传时间

第一步:在视图里准备好要传给模板的数据

不管你用函数视图还是类视图,核心是把用户的Profile和对应的视频列表传到模板。这里给你两种常用写法:

函数视图(适合展示当前登录用户的内容)

from django.shortcuts import render
from django.contrib.auth.decorators import login_required
from .models import Profile, VideoFile

@login_required  # 确保只有登录用户能访问
def my_videos(request):
    # 获取当前登录用户
    current_user = request.user
    # 拿到用户的Profile,用get_or_create避免用户没创建Profile时报错
    user_profile, _ = Profile.objects.get_or_create(user=current_user)
    # 获取该用户的所有视频,用related_name反向查询更简洁
    user_video_list = current_user.videos.all()
    
    # 把数据打包传给模板
    context = {
        'profile': user_profile,
        'videos': user_video_list,
    }
    return render(request, 'videos/user_videos.html', context)

类视图(适合展示指定用户的内容,比如用户主页)

from django.views.generic.detail import DetailView
from django.contrib.auth.models import User
from django.contrib.auth.mixins import LoginRequiredMixin
from .models import Profile, VideoFile

class UserVideoView(LoginRequiredMixin, DetailView):
    model = User
    template_name = 'videos/user_videos.html'
    context_object_name = 'target_user'  # 模板里用这个变量指代当前展示的用户

    def get_context_data(self, **kwargs):
        # 先获取父类的上下文
        context = super().get_context_data(**kwargs)
        # 拿到当前要展示的用户对象
        target_user = self.get_object()
        # 获取该用户的Profile
        context['profile'] = Profile.objects.get_or_create(user=target_user)[0]
        # 获取该用户的所有视频
        context['videos'] = target_user.videos.all()
        return context

第二步:在模板里渲染数据(videos/user_videos.html)

现在模板里可以直接用传过来的变量,还要处理昵称为空的情况,以及视频为空的提示:

<!-- 展示用户昵称,没设置的话显示用户名作为备用 -->
<h2>{{ profile.nickname|default:target_user.username }}的视频库</h2>

<!-- 展示视频列表 -->
{% if videos %}
    <div class="video-list">
        {% for video in videos %}
            <div class="video-item">
                <p>
                    <!-- 显示视频标题(如果有的话),否则显示文件名 -->
                    {{ video.title|default:video.video_file.name }}
                    <!-- 视频上传时间 -->
                    <small>上传于:{{ video.upload_time|date:"Y-m-d H:i" }}</small>
                </p>
                <!-- 视频下载/播放链接 -->
                <a href="{{ video.video_file.url }}" class="video-link" target="_blank">
                    查看视频
                </a>
            </div>
        {% endfor %}
    </div>
{% else %}
    <p>还没有上传任何视频哦😯</p>
{% endif %}

几个关键注意事项

  • 避免Profile不存在的报错:用get_or_create而不是直接get,这样即使用户还没创建Profile,也会自动生成一个空的,不会在模板里抛异常。
  • 反向查询的便利性:VideoFile的外键设置related_name='videos'后,就能直接用user.videos.all()获取该用户的所有视频,比默认的user.videofile_set.all()可读性强太多。
  • 登录验证:如果是展示用户私人内容,一定要加登录验证,避免未登录用户访问。

内容的提问来源于stack exchange,提问作者Jekson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:24:13