【问题标题】:Form and File Uploading in DjangoDjango中的表单和文件上传
【发布时间】:2012-09-30 12:55:29
【问题描述】:

当我尝试提交表单时,我一直试图找出问题所在。 当我在表单上点击提交时,我在网页上收到此响应:

Image:
    This field is required.

好像我没有在表单中包含图片!

settings.py

...
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': '/path/to/myproject/database/sqlite.db'),
        'USER': '',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
    }
}
...
MEDIA_ROOT = '/path/to/myproject/media/'
MEDIA_URL = '/media/'
...
INSTALLED_APPS = (
    ...
    'myapp',
)

models.py

from PIL import Image
from django import forms
from django.db import models
from django.forms import ModelForm

UPLOADER_CHOICES = (
    ('C', 'Common User'),
    ('N', 'Nutrition Kitchen'),
)

class Meal(models.Model):

    title       = models.CharField(max_length=100)
    slug        = models.SlugField(unique=True)
    image       = models.ImageField(upload_to='images/')
    serves      = models.IntegerField()
    ingredients = models.CharField(max_length=1000)
    instructions= models.CharField(max_length=1000)
    time_period = models.IntegerField()# in minutes
    uploader    = models.CharField(max_length=1, choices=UPLOADER_CHOICES)

def __unicode__(self):
    return self.title

forms.py

from django import forms
from meal.models import Meal

class MealForm(forms.Form):

    title       = forms.CharField(max_length=100)
    image       = forms.ImageField()
    ingredients = forms.CharField(max_length=1000)
    instructions= forms.CharField(max_length=1000)
    time_period = forms.IntegerField(required=False)
    serves      = forms.IntegerField(required=False)

views.py

from django.shortcuts import render_to_response
from django.template import RequestContext
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from meal.models import Meal
from meal.forms import MealForm

def upload(request):
    if request.method == 'POST':
        form = MealForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return render_to_response('upload.html', {'form': form})
    else:
        form = MealForm()
    return render_to_response('upload.html', {'form': form}, context_instance=RequestContext(request)
    )

上传.html

{% extends "base.html" %}
{% block content %}
{% if form.errors %}
        <p style="color: red;">
            Please correct the error{{ form.errors|pluralize }} below.
        </p>
{% endif %}
<div data-role="content" style="padding: 15px">
    <form action="" method="POST" enctype="multipart/form-data">
            {% csrf_token %}
            {{ form.errors }}
            {{ form.non_field_errors }}
            {{ form.as_table }}
        <input type="submit" value="Submit" id="Save">
    </form>
</div>
{% endblock %}

有没有人知道我可能做错了什么?我觉得我什么都试过了。

【问题讨论】:

  • 尝试将 MealForm(forms.Form) 类更改为 MealForm(forms.ModelForm) 类,其他一切看起来都不错。

标签: django forms file-upload


【解决方案1】:

好的,事实证明这是 jQuery Mobile 的问题,我之前没有提到。我需要做的就是改变

<form action="" method="post" enctype="multipart/form-data">

<form action="" method="post" enctype="multipart/form-data" data-ajax="false">

因为 jQuery 试图为我处理 POST。显然,当您在 Django 中发布到相同的 URL 并想要手动处理它时,您必须包含

data-ajax="false"

【讨论】:

    【解决方案2】:

    在你的 forms.py 中试试这个

    image = forms.ImageField(widget=forms.FileInput())
    

    希望对你有帮助

    【讨论】:

    • 不,那没用。相同的“此字段为必填项”错误。就像它认为我正在向它发送一个没有文件的表单。我是否缺少将文件绑定到该 POST 或类似的东西?
    【解决方案3】:

    在你的模型中

    models.ImageField(upload_to='images/')
    

    此字段是必需的。 改成

    models.ImageField(upload_to='images/', blank=True, null=True)
    

    将不再需要

    【讨论】:

      【解决方案4】:

      这一行:

      form.save()
      

      ...什么都不做。您应该要么处理来自表单的cleaned_data,要么使用具有save() 方法的ModelForm。

      Django Forms | Django ModelForms

      【讨论】:

      • 那么,如果我希望从 ModelForm 对象中获取的所有字段都保存到 Meal 类中的相应字段中,以便在数据库中创建一个全新的 Meal 对象,我该怎么做呢?跨度>
      • # in models.py class MealForm(ModelForm): class Meta: model = Meal ... # in views.py form = MealForm(...)
      【解决方案5】:

      看来你错过了,

      class MealForm(forms.Form):
          class Meta:
              model = Meal 
          title = forms.CharField(max_length=100)
      

      【讨论】:

      • 我试过了,还是不行。我真的不明白那会完成什么。我已经在表单中定义了字段。
      • @DavidSawyer 删除 MealForm 中的所有字段怎么样?
      • 不。人!它仍然给我同样的错误。我是否需要专门单独保存图像或其他内容,而不是仅执行 form.save()?
      • 如果要使用 Meta 类并指定模型,则需要将 MealForm(forms.Form) 更改为 MealForm(forms.ModelForm)。 \
      【解决方案6】:

      尝试使用 modelform 而不是常规的form

      class MealForm(forms.ModelForm): #Note, this is a Modelform, not a regular old form.
          class Meta: 
              model = Meal
      

      【讨论】:

      • 我刚刚切换了它,但它仍然给我同样的错误。我应该更改 views.py 中的任何内容吗?
      猜你喜欢
      • 1970-01-01
      • 2011-06-29
      • 2014-10-27
      • 2013-10-04
      • 2018-01-25
      • 1970-01-01
      • 2020-11-04
      • 2017-05-19
      • 1970-01-01
      相关资源
      最近更新 更多