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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 18:01:16