5

フォームを送信しようとすると、何が問題なのかを理解しようとしています。フォームで送信を押すと、Web ページで次の応答が返されます。

Image:
    This field is required.

フォームに画像が含まれていないと思われるようです。

設定.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

フォーム.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)

ビュー.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)
    )

upload.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 %}

私が間違っている可能性があることについて誰か考えがありますか? 私はすべてを試したような気がします。

4

6 に答える 6

7

さて、先ほど触れなかった 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 に POST し、手動で処理したい場合は、

data-ajax="false"
于 2012-10-14T19:35:03.903 に答える
1

この行:

form.save()

...何もしません。フォームからcleaned_dataを処理するか、save()メソッドを持つModelFormを使用する必要があります。

Django フォーム| Django ModelForms

于 2012-10-11T02:37:50.673 に答える
1

あなたのforms.pyでこれを試してください

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

役立つことを願っています

于 2012-10-10T07:20:53.283 に答える
1

あなたのモデルでは

models.ImageField(upload_to='images/')

この項目は必須です。それをに変更する

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

不要にします

于 2012-10-11T00:53:48.573 に答える
0

通常のフォームの代わりにモデルフォームを使用してみてください。

class MealForm(forms.ModelForm): #Note, this is a Modelform, not a regular old form.
    class Meta: 
        model = Meal
于 2012-10-10T20:45:32.720 に答える
0

これを見落としていたようですが、

class MealForm(forms.Form):
    class Meta:
        model = Meal 
    title = forms.CharField(max_length=100)
于 2012-10-10T06:00:08.313 に答える