Django ImageField 保存 NoneType 对象错误

0 投票
2 回答
1024 浏览
提问于 2025-04-17 03:02

我该怎么用imagefield上传图片呢?我现在的做法出现了一个错误,提示'NoneType' object has no attribute 'chunks'

我觉得我可能做错了,有人能教我正确的做法吗?

这是我目前保存上传图片的代码。

def add_employee(request):

if request.method == 'POST':
    form_input = AddEmployee(request.POST, request.FILES)
    if form_input.is_valid():
        cd = form_input.cleaned_data
        new_emp = Employees(
                first_name = cd['first_name']
                .....
            )

        new_emp.save()
        photo_file = cd['photo_file']
        new_emp.photo.save('filename', photo_file)

     return HttpResponseRedirect('/thanks/')

这是forms.py和models.py的内容。

class AddEmployee(forms.Form):
      ...
      photo_file = forms.ImageField(required=False)

class Employees(models.Model):
      ...
      photo = models.ImageField(upload_to='employee_photos', blank=True, null=True)

2 个回答

0

你可能应该使用模型表单(modelforms)。使用模型表单的话,你的代码大概会是这样的:

在 forms.py 文件中:

from django import forms

from .models import Employees

class EmployeeForm(forms.ModelForm):
    class Meta:
        model = Employees

在 views.py 文件中:

from django.shortcuts import render
from django.http import HttpResponseRedirect

from .forms import EmployeeForm

def add_employee(request):
    form = EmployeeForm(request.POST or None, request.FILES or None)

    if form.is_valid():
        form.save()
        return HttpResponseRedirect('/thanks/')

    return render(request, 'your_template.html', {'form': form})

这是处理与模型相关的表单的标准做法,也是最佳实践。这里的 request.POST or None 是一种技巧,可以避免你需要检查 request.method == 'POST'

这是一个简单的例子,你可以很容易地添加选择字段来决定是否包含在模型中,或者为特定的表单添加额外的字段,还可以在保存模型之前添加额外的逻辑,或者添加自定义的验证。

想了解更多,可以查看 ModelForms 的文档:https://docs.djangoproject.com/en/dev/topics/forms/modelforms/

1

好的,经过一番查找,我终于找到了问题所在。

request.FILES 没有获取到任何东西,所以出现了 NoneType 的错误。我需要在我的表单中添加 enctype=multipart/form-data,这样请求才能正常工作。

撰写回答