Django загрузка изображения из формы
У меня возникла странная проблема. Я работаю с базой данных PostgreSQL. Я создал модель и форму, перенес их, зарегистрировал в admin.py.
Когда я нахожусь в панели администратора, я могу добавить данные в форму. Одним из полей является изображение, которое в процессе копируется в media/images. (MEDIA объявляется в settings.py). Это работает как шарм. Все данные (включая изображение) сохраняются в базе данных и могут быть отображены в html.
Но работа из админ-панели не была моим первым выбором, поэтому я сделал html-страницу с формой для ввода данных в базу. Я заполняю поля, добавляю изображение и отправляю форму. Он сообщает мне, что данные успешно добавлены в базу данных.
Когда я смотрю в админ панели, запись действительно добавлена, вся информация заполнена, НО изображения нет. (написано, что не выбран файл). Также само изображение не сохраняется в media/images. Если я добавляю изображение снова в админ панели и сохраняю его, оно работает. Значит что-то идет не так от формы к базе данных с сохранением изображения.
Я много гуглил, и прочитал, что я должен добавить enctype="multipart/form-data" в моей форме method="POST". Я просмотрел все файлы и сравнил, что отличается в моем коде. Но я не могу найти это
Код: (В некоторых файлах я показываю только соответствующий код, а не весь)...
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 формы все данные сохраняются, кроме изображения. (а также файл не сохраняется в media/images). Я уверен, что это должно быть что-то маленькое, или опечатка, так как в основном все работает, если я иду по пути админ-панели...
Вам нужно передать request.FILES
в вашу форму.
form = UnderdarkForm(request.POST, request.FILES)