如何在Django中实现仅显示当前用户上传的文档?
实现Django用户仅查看自身上传文档的方案
1. 给文档模型添加用户外键关联
先在你的models.py里,给文档模型新增一个外键字段,关联Django内置的User模型,让每篇文档都能记录上传它的用户:
from django.db import models from django.contrib.auth.models import User class Document(models.Model): title = models.CharField(max_length=200) file = models.FileField(upload_to='documents/') upload_time = models.DateTimeField(auto_now_add=True) # 新增关联用户的外键 user = models.ForeignKey(User, on_delete=models.CASCADE)
修改完模型后,执行数据库迁移命令:
python manage.py makemigrations python manage.py migrate
如果你的表已有旧数据,迁移时会提示设置默认值,临时可填default=1(对应admin用户ID),之后记得手动把旧文档关联到对应用户,或者根据实际情况调整。
2. 上传文档时自动关联当前登录用户
不管用函数视图还是类视图,都要在保存文档时把当前登录用户绑定到文档的user字段:
- 函数视图示例:
from django.shortcuts import render, redirect from .forms import DocumentForm from .models import Document def upload_document(request): if request.method == 'POST': form = DocumentForm(request.POST, request.FILES) if form.is_valid(): # 先不提交到数据库,手动添加用户 doc = form.save(commit=False) doc.user = request.user doc.save() return redirect('document_list') else: form = DocumentForm() return render(request, 'upload.html', {'form': form})
- 类视图(CreateView)示例:
from django.views.generic.edit import CreateView from .models import Document from .forms import DocumentForm class DocumentCreateView(CreateView): model = Document form_class = DocumentForm success_url = '/documents/' def form_valid(self, form): # 给表单实例绑定当前用户 form.instance.user = self.request.user return super().form_valid(form)
3. 列表查询时只返回当前用户的文档
在展示文档列表的视图里,过滤出当前登录用户的文档,阻止用户查看他人内容:
- 函数视图示例:
def document_list(request): # 只查询当前用户的文档 documents = Document.objects.filter(user=request.user) return render(request, 'document_list.html', {'documents': documents})
- 类视图(ListView)示例:
from django.views.generic.list import ListView from .models import Document class DocumentListView(ListView): model = Document template_name = 'document_list.html' context_object_name = 'documents' def get_queryset(self): # 重写查询方法,只返回当前用户的文档 return Document.objects.filter(user=self.request.user)
4. 模板渲染(无需额外修改)
模板里正常循环渲染documents即可,因为查询集已经是过滤后的当前用户数据:
<ul> {% for doc in documents %} <li>{{ doc.title }} - {{ doc.upload_time }} <a href="{{ doc.file.url }}">下载</a></li> {% endfor %} </ul>
内容的提问来源于stack exchange,提问作者Sahil Deshpande
相关产品推荐
相关产品推荐

