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)
Вернуться на верх