如何在Django中将图片仅保存到当前用户对应的模型中?
问题需求
现有Django项目代码如下,需实现:用户上传图片时,将图片与当前登录用户关联,仅保存到该用户对应的模型实例中。
原项目代码
models.py
class Imageadd(models.Model): image_owner = models.ForeignKey(Profile,null=True,blank=True,on_delete=models.CASCADE) image = models.ImageField(default='default.jpg',upload_to='blood/') date = models.DateTimeField(default=now) def __str__(self): return str(self.image_owner)
views.py
def bloodImage(request): if request.method == 'POST' and request.FILES['pic']: image = request.FILES['pic'] img_obj = Imageadd(image=image)
index.html
<form action='' method='post' enctype="multipart/form-data"> {% csrf_token %} <input type='file' name='pic' accept='image/*' class="custom-file-input"> <input type='submit' class="button"> </form>
修改方案
1. 修改 views.py
核心是验证用户登录状态,并将图片关联到当前用户的Profile实例,同时完成数据库保存:
from django.contrib.auth.decorators import login_required from django.shortcuts import redirect, render @login_required # 强制用户登录才能访问上传功能 def bloodImage(request): if request.method == 'POST' and request.FILES.get('pic'): image = request.FILES['pic'] # 关联当前登录用户的Profile实例(假设User与Profile为一对一关联) img_obj = Imageadd(image=image, image_owner=request.user.profile) img_obj.save() # 必须调用save()将数据写入数据库 # 可选:上传成功后跳转至指定页面 return redirect('success-page') # 替换为你的成功页面URL名称 return render(request, 'index.html')
2. 优化 models.py(可选)
既然要求图片必须关联用户,可去掉image_owner的null=True, blank=True,强制每个图片都有所有者:
class Imageadd(models.Model): # 移除null和blank参数,确保图片必须绑定用户 image_owner = models.ForeignKey(Profile, on_delete=models.CASCADE) image = models.ImageField(default='default.jpg',upload_to='blood/') date = models.DateTimeField(default=now) def __str__(self): return str(self.image_owner)
3. 优化 index.html(可选)
仅对登录用户显示上传表单,避免未登录用户看到无效操作入口:
{% if user.is_authenticated %} <form action='' method='post' enctype="multipart/form-data"> {% csrf_token %} <input type='file' name='pic' accept='image/*' class="custom-file-input"> <input type='submit' class="button"> </form> {% else %} <p>请先登录才能上传图片</p> {% endif %}
内容的提问来源于stack exchange,提问作者sadia islam
相关产品推荐
相关产品推荐

