【问题标题】:Django upload image from formDjango从表单上传图片
【发布时间】: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 表单存储除图像之外的所有数据。 (而且该文件也不存储在媒体/图像中)。我敢肯定它一定是小东西,或者是错字,因为如果我采用管理面板路线,基本上它就可以工作......

【问题讨论】:

    标签: html django


    【解决方案1】:

    您需要将request.FILES 传递给您的表单。

    form = UnderdarkForm(request.POST, request.FILES)
    

    【讨论】:

    • 先生,您是救生员。 1,5 天的搜索没有给我任何结果,5 分钟在这里,并添加了 request.files,IT 工作!
    • 很高兴听到这个消息:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    相关资源
    最近更新 更多