django - 图像没有通过模型表单上传到 django,而是从管理面板添加
问题描述
因此,在我的 django 项目中,我有一个页面,用户可以在其中通过表单填写有关他的个人资料的详细信息。
表格如下:
class VendorProfileForm(ModelForm):
class Meta:
model = Vendor
fields = ['name', 'address', 'pincode', 'phone', 'email', 'image1', 'image2', 'image3', 'image4']
该表格所指的型号“供应商”如下:
class Vendor(models.Model):
name = models.CharField(max_length=255)
email = models.EmailField(blank=True, null=True)
pincode = models.IntegerField(blank=True, null=True)
phone = models.CharField(blank=True, null=True, max_length=20)
address = models.CharField(blank=True, null=True, max_length=200)
image1 = models.ImageField(upload_to='shop_images/', blank=True, null=True)
image2 = models.ImageField(upload_to='shop_images/', blank=True, null=True)
image3 = models.ImageField(upload_to='shop_images/', blank=True, null=True)
image4 = models.ImageField(upload_to='shop_images/', blank=True, null=True)
created_by = models.OneToOneField(User, related_name='vendor', on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
使用的视图如下:
@login_required
def vendor_profile_details(request):
if request.method == 'POST':
form = VendorProfileForm(request.POST)
if form.is_valid():
vendor = form.save(commit=False)
vendor.created_by = request.user
vendor.save()
return redirect('vendor_admin')
else:
form = VendorProfileForm()
return render(request, 'vendor_profile_details.html', {'form': form})
前端部分“vendor_profile_details.html”使用的模板如下:
{% extends 'base.html' %}
{% block title %}Profile details | {% endblock %}
{% block content %}
<h1 class="title">Finish your profile</h1>
<form method="post" action="." method = "post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<div class="field">
<div class="control">
<button class="button is-dark is-uppercase" type="submit">Save</button>
</div>
</div>
</form>
<hr>
{% endblock %}
在项目的主项目 urls.py 文件中,我包含了各种其他应用程序的所有 url,我已经完成了静态上传的设置
from django.conf import settings
from django.contrib import admin
from django.urls import path, include
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
path('vendors/', include('vendor.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
我已经在 settings.py 文件中正确定义了媒体文件夹
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR/'media/'
尽管做了所有这些,我的图像并没有通过表单上传到媒体文件夹中。但是,当我进入管理面板并直接从那里添加图像时,图像会成功上传到媒体文件夹中。为什么会出现这个问题?
解决方案
您还需要提供request.FILES作为表单的参数:
if request.method == 'POST':
form = VendorProfileForm(request.POST, request.FILES)
请参阅https://docs.djangoproject.com/en/3.2/ref/forms/api/#binding-uploaded-files
在实践中,您通常会指定 request.FILES 作为文件数据的来源(就像您使用 request.POST 作为表单数据的来源一样):
# Bound form with an image field, data from the request >>> f = ContactFormWithMugshot(request.POST, request.FILES)
推荐阅读
- vhdl - vhdl 错误:靠近文本“<=”;期待“(”,或标识符,或一元运算符
- c++ - 带着色器的现代 OpenGL 球体绘图
- c# - 将视图模型传递给 ASP.NET MVC 中的视图时出错
- outlook - 使用 C# 通过 ical-Subscribe(Request type :Webcal) Outlook 日历设置警报
- excel - 如何引用共享邮箱的非默认文件夹
- javascript - EventListener click 在移动设备和隐身窗口上不起作用
- reactjs - Node js vs React 关于错误的一些疑问
- vuejs2 - 在 VUEJS 中日历内的日期上显示名称
- reactjs - 将网站文件放在 public_html 中是否安全
- sql-server - 使用 Terraform 扩展磁盘 SQL Server 虚拟机