【发布时间】:2021-08-10 19:17:17
【问题描述】:
我遇到了这个奇怪的问题。我使用 PostgreSQL 数据库。 我做了一个模型和表单并迁移它,在 admin.py 中注册。
当我在管理面板中时,我可以向表单添加数据。其中一个字段是图像,在此过程中将其复制到媒体/图像。 (媒体在 settings.py 中声明)。 这就像一个魅力。所有数据(包括图片)都保存在数据库中,可以用html显示。
但是从管理面板工作并不是我的第一选择,所以我制作了一个带有表单的 html 页面来将数据输入到数据库中。我填写字段,添加图像并提交。 它告诉我数据已成功添加到数据库中。
当我查看管理面板时,确实添加了记录,填写了所有信息,但图像没有。 (它说没有选择文件)。图像本身也不存储在媒体/图像中。 如果我在管理面板中再次添加图像并保存它,它就可以工作。因此,保存图像时从表单到数据库出现了问题。
我用谷歌搜索了很多,并读到我应该在我的表单方法 =“POST”中添加 enctype =“multipart/form-data”。 我查看了所有文件并比较了我的代码中的不同之处。但是我找不到。
代码:(在某些文件中我只显示相关代码,而不是全部)..
index.html
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" class="btn btn-secondary">
</form>
urls.py
from django.urls import path
from . import views
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('', views.index, name='index'),
path('monsters', views.monsters, name='monsters'),
path('monsterinfo', views.monsterinfo, name='monsterinfo'),
path('addmonster', views.addmonster, name='addmonster'),
]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
views.py
from django.shortcuts import render, redirect
from django.http import HttpResponseRedirect
from .models import Underdark_Monsters
from django.contrib import messages
from .forms import UnderdarkForm
def addmonster(request):
submitted = False
if request.method == "POST":
form = UnderdarkForm(request.POST)
if form.is_valid():
form.save()
img_obj = form.instance
return HttpResponseRedirect('/addmonster?submitted=True', {'form': form, 'img_obj': img_obj})
else:
form = UnderdarkForm
if 'submitted' in request.GET:
submitted = True
return render(request, 'addmonster.html', {'form': form, 'submitted': submitted})
def __str__(self):
return self.name
models.py
from django.db import models
from django.forms.fields import NullBooleanField
# Create your models here.
class Underdark_Monsters(models.Model):
image = models.ImageField(blank=True,
upload_to='images/')
table = models.ImageField(blank=True,
upload_to='images/')
forms.py
from django import forms
from django.utils.safestring import mark_safe
from django.forms import ModelForm
from .models import Underdark_Monsters
# Maak een addmonster formulier
class UnderdarkForm(forms.ModelForm):
class Meta:
model = Underdark_Monsters
fields = ('image', 'cr', 'name', 'source',
'type', 'size', 'Alignment', 'tags', 'info', 'table')
labels = {
'image': 'Image:',
'cr': '',
'name': '',
'source': '',
'type': '',
'size': '',
'Alignment': '',
'tags': '',
'info': '',
'table': 'Table:',
}
widgets = {
'cr': forms.Select(attrs={'class': 'form-control', 'placeholder': 'Cr'}),
'name': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Name'}),
'source': forms.Select(attrs={'class': 'form-control', 'placeholder': 'Source'}),
'type': forms.Select(attrs={'class': 'form-control', 'placeholder': 'Type'}),
'size': forms.Select(attrs={'class': 'form-control', 'placeholder': 'Size'}),
'Alignment': forms.Select(attrs={'class': 'form-control', 'placeholder': 'Alignment'}),
'tags': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Tags'}),
'info': forms.Textarea(attrs={'class': 'form-control', 'placeholder': 'Info'}),
}
希望有人可以向我解释为什么在管理面板中添加图像有效,并且直接从 html 表单存储除图像之外的所有数据。 (而且该文件也不存储在媒体/图像中)。我敢肯定它一定是小东西,或者是错字,因为如果我采用管理面板路线,基本上它就可以工作......
【问题讨论】: