如果我上传文件,为什么 Django 会强制我上传图片?

Why Django forces me to upload an image if I upload a file?

我有这个非常简单的 Django-Rest-Framework 任务应用程序,它现在的行为符合我的预期。

图像和文件上传都有效,url 路由它们的 url 也是如此。但是,当我仅将 Doc 上传到新的 Task 时,出现以下错误 >

{
    "image": [
        "The submitted data was not a file. Check the encoding type on the form."
    ]
} 

请注意,我刚刚添加了 blank=True 字段,但没有它时行为是相同的。默认的 No-img.jpg 和 No-doc.pdf 文件存在并且路由正常。

这是我的 TaskApp/models.py

from django.db import models


class Task(models.Model):
    task_name = models.CharField(max_length=20)
    task_desc = models.TextField(max_length=200)
    completed = models.BooleanField(default=False)
    date_created = models.DateTimeField(auto_now_add=True, auto_created=True)
    image = models.ImageField(upload_to='Images/', default='Images/None/No-img.jpg', blank=True)
    doc = models.FileField(upload_to='Doc/', default='Doc/None/No-doc.pdf')

    def __str__(self):
        return '{}'.format(self.task_name)

# TODO try to understand why this model requires image upload

这是我的 TaskApp/serializers.py

从 rest_framework 导入序列化程序 从 .models 导入任务

class TaskSerializer(serializers.ModelSerializer):

    image = serializers.ImageField(max_length=None, use_url=True)
    doc = serializers.FileField(max_length=None, use_url=True)

    class Meta:
        model = Task
        fields = ('id', 'task_name', 'task_desc', 'completed', 'date_created', 'image', 'doc')

这是我的 TaskApp/views.py

从 rest_framework 导入视图集、过滤器 从 .models 导入任务 从 .serializers 导入 TaskSerializer

class TaskViewSet(viewsets.ModelViewSet):
    queryset = Task.objects.all()  # We use filters for ordering by part
    serializer_class = TaskSerializer
    filter_backends = (filters.DjangoFilterBackend, filters.OrderingFilter, filters.SearchFilter)
    filter_fields = ('completed',)
    ordering = ('-date_created',)
    search_fields = ('task_name',)

这是我的 TaskAPI/urls.py

from django.conf.urls import url, include
from django.contrib import admin
from rest_framework import routers
from TaskApp import views
from django.conf.urls.static import static
from django.conf import settings

router = routers.DefaultRouter()
router.register(r'task', views.TaskViewSet)
# router.register(r'due_task', views.DueTaskViewSet)
# router.register(r'completed_task', views.CompletedTaskViewSet)

urlpatterns = [
    url(r'^', include(router.urls)),
    url(r'^admin/', admin.site.urls),
]+static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

我不确定为什么会这样。非常感谢任何帮助。

问题出在您的序列化程序上。您已经覆盖了 imagedoc 的定义;与 ModelForms 一样,当您在模型序列化程序中重新定义字段时,您会重新定义 all 它的选项;在这种情况下,包括是否需要。您需要明确声明:

class TaskSerializer(serializers.ModelSerializer):

    image = serializers.ImageField(max_length=None, use_url=True, required=False)
    doc = serializers.FileField(max_length=None, use_url=True)