python - Django 表单不保存图像文件
问题描述
在这个 webapp 中,我有一个问题模型和一个问题图模型。每当用户上传图像时,它应该保存在 media/question_image 文件夹中。如果我从管理面板上传它工作正常,但是当我从网页上传图像时它没有被保存。事实是,发布请求正在工作,我没有收到任何错误。图像未保存在所需的位置。这是我所有的代码:model.py
class QuestionDiagram(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name='questionDiagrams')
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
question_diagram = models.ImageField(upload_to='question_diagram/')
question_diagram_text = models.CharField(max_length = 48)
date = models.DateTimeField(auto_now_add=True, blank=True, null=True)
表格.py
class QuestionDiagramForm(forms.ModelForm):
question_diagram = forms.CharField(widget = forms.FileInput(attrs={'class':'questionDiagram-questionDiagram'}))
question_diagram_text = forms.CharField(widget = forms.Textarea(attrs={'class':'questionDiagram-questionDiagramText', 'placeholder':'Describe', 'maxlength':'48'}))
class Meta:
model = QuestionDiagram
fields = ['question_diagram', 'question_diagram_text']
设置.py
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
在项目 urls.py 中(添加了 mediaroot 和 mediaurl)......
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
视图.py
class QuestionDiagramView(View):
form_class = QuestionDiagramForm
template_name = 'mechinpy/question_diagram.html'
def get(self, request, slug):
form = self.form_class(None)
return render(request, self.template_name, {'form':form})
def post(self, request, slug):
question = get_object_or_404(Question, slug=slug)
form = self.form_class(request.POST, request.FILES)
if form.is_valid():
questiondiagram = form.save(commit=False)
questiondiagram.user = self.request.user
questiondiagram.question = question
questiondiagram.save()
return redirect('mechinpy:detail', question.slug)
else:
return render(request, self.template_name, {'form':form})
html
<form class="form-block" method="POST" action="" enctype="multipart/form-data">
{% csrf_token %}
<!-- Question Diagram Error -->
<span class="show-error">{{form.non_field_errors}}</span>
{% for fields in form %}
<span class="show-error"> {{fields.errors}} </span>
<!-- Question Diagram Fields -->
<div class="show-field"> {{fields}} </div>
{% endfor %}
<!-- Question Diagram Submit Button -->
<div class="submit-content">
<button class="submit-button" type="submit"> Submit </button>
</div>
网址.py
path('m/question/<slug:slug>/diagram/add/', views.QuestionDiagramView.as_view(), name='question_diagram'),
解决方案
这里:
class QuestionDiagramForm(forms.ModelForm):
question_diagram = forms.CharField(...)
你想要一个ImageField
,而不是一个CharField
。FWIW,你应该只保留默认字段,你不需要重写它们只是为了添加 css classes。
推荐阅读
- postgresql - docker - postgres upgrade 11 to 12 postmaster issue
- ios - 无法从 iOS 中的 PHAssets 访问 /var/mobile/Media/PhotoData/Sync/100SYNCD/ 文件夹中的媒体文件?
- sql - 我有 3 个表,需要独占左连接
- angular - 如何从传单绘制工具栏中获取变量的几何类型
- amazon-web-services - 将最新镜像从 ECR 部署到 EC2
- javascript - 如何构建一个 Slack Bot 在特定时间每天提醒晚餐?
- azure - 将 conf 文件添加到 Microsoft Azure 中的类路径
- automation - 我如何知道 botium 中哪些话语测试用例失败了?
- hyperledger-fabric - 如何使用教程加入 swarm,wahab 的 Hyperledger Fabric on multiple hosts
- kubernetes - 在 kube-apiserver 中注册一个 kubelet