无法将图像上传到 Django 项目,获取表单对象没有属性“保存”

Posted

技术标签:

【中文标题】无法将图像上传到 Django 项目,获取表单对象没有属性“保存”【英文标题】:Unable to upload image to Django Project, getting Form object has no attribute 'save' 【发布时间】:2020-05-07 07:01:23 【问题描述】:

我正在尝试通过模板输入的文件上传图像文件。我已按照所有说明操作,但在附加文件并单击提交时出现此错误。

AttributeError: 'PicUpForm' object has no attribute 'save'

因此我的图像没有上传到指定的目录以及记录没有插入到我的sqlitedb中

以下是我使用过的所有必要代码:

views.py

def add_image(request):
    form = PicUpForm()
    if request.method == "POST":
        form = PicUpForm(data=request.POST, files=request.FILES)
    if form.is_valid():
        form.save()
        return redirect("")
    else:
        return render(request, "sample.html", "form": form)

forms.py

class PicUpForm(forms.Form):
    class Meta:
        model = PicUpClass
        fields = [model.picture]
    picture = forms.ImageField(label='File')

models.py

def upload_to(instance, filename):
    now = timezone_now()
    base, ext = os.path.splitext(filename)
    ext = ext.lower()
    return f"C:/Users/Aayush/ev_manage/face_detector/static/img/now:%Y/%m/%Y%m%d%H%M%Sext"



class PicUpClass(models.Model):
    picture = models.ImageField(_("picture"), upload_to=upload_to, blank=True, null=True)

sample.html

% block content %
% load static %
    <form method="post" action="/picup" enctype="multipart/form-data">
        % csrf_token %
         form 
        <button type="submit">submit</button>
    </form>
% endblock %

urls.py

...
path('picup', views.add_image, name='picup'),

我还根据需要在创建模型后运行了 makemigrations 和 migrate 命令。请帮助我,因为我是 Python 新手,非常重要的是需要完成此功能

【问题讨论】:

应该是ModelForm,所以PicUpForm(forms.ModelForm): Fruthermore 请使用字符串作为字段,所以fields = ['picture'] 尝试了这个现在得到``` NoReverseMatch at /picup Reverse for '' not found。 '' 不是有效的视图函数或模式名称。 ``` 那是由于return redirect(""),你应该传递一个视图的名称。 【参考方案1】:

您的PicUpForm不是ModelForm,因此它根本不会考虑Meta。请注意,字段应该是字符串列表,因此您应该将表单重写为:

class PicUpForm(forms.ModelForm):
    class Meta:
        model = PicUpClass
        fields = ['picture']

请注意,在您的视图中,对于redirect(..),您需要传递视图的名称,因此:

def add_image(request):
    if request.method == 'POST':
        form = PicUpForm(data=request.POST, files=request.FILES)
        if form.is_valid():
            form.save()
            return redirect('name-of-view')
    else:
        form = PicUpForm()
    return render(request, 'sample.html', 'form': form)

这里需要将name-of-view替换为视图的名称。

如果视图包含参数,您可以将其作为命名参数传递,例如这里如果您的视图有picture_id 参数(如果它有另一个参数,那么您当然应该更改参数的名称) :

def add_image(request):
    if request.method == 'POST':
        form = PicUpForm(data=request.POST, files=request.FILES)
        if form.is_valid():
            picup = form.save()
            return redirect('name-of-view', picture_id=picup.pk)
    else:
        form = PicUpForm()
    return render(request, 'sample.html', 'form': form)

【讨论】:

运气不好。现在在 /picup Reverse for '' not found 处收到错误 NoReverseMatch。 '' 不是有效的视图函数或模式名称。 嘿@willem 你能帮我做一件事吗?在行 return redirect('name of view') 我还想发送一个参数,其中包含包含路径的插入记录图片字段的值。我想在另一个视图函数和模板中访问该路径。请问可以吗?? @AayushGupta:见编辑:例如,如果您的视图有 picture_id 参数,则可以使用命名参数。 但我想访问“图片”字段值而不是 id 字段 @AayushGupta:那就是pickup.picture。但是您可以在 URL 中“编码”图片。您应该对具有编码的东西进行编码(如主键、slug 等)

以上是关于无法将图像上传到 Django 项目,获取表单对象没有属性“保存”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 django-storages 将图像上传到亚马逊 S3?在管理员中上传有效,但在网站表单中无效

如何将图像上传到 Django

通过上传表单将图像上传到Django用户个人资料

将 JavaScript 生成的图像上传到 Django

无法从 django 服务器中的数据库上传图像

使用 Django 模型表单上传图像