如果我上传文件,为什么 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)
我不确定为什么会这样。非常感谢任何帮助。
问题出在您的序列化程序上。您已经覆盖了 image
和 doc
的定义;与 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)
我有这个非常简单的 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)
我不确定为什么会这样。非常感谢任何帮助。
问题出在您的序列化程序上。您已经覆盖了 image
和 doc
的定义;与 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)