Django中的表单和文件上传

Dav*_*yer 5 forms django file-upload

当我尝试提交表单时,我一直试图弄清楚出了什么问题.当我点击表单上的提交时,我在网页上收到此回复:

Image:
    This field is required.
Run Code Online (Sandbox Code Playgroud)

它似乎认为我没有在表单中包含图像!

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',
)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

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)
    )
Run Code Online (Sandbox Code Playgroud)

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 %}
Run Code Online (Sandbox Code Playgroud)

有没有人对我可能做错了什么有任何想法?我觉得我已经尝试了一切.

Dav*_*yer 5

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

<form action="" method="post" enctype="multipart/form-data">
Run Code Online (Sandbox Code Playgroud)

<form action="" method="post" enctype="multipart/form-data" data-ajax="false">
Run Code Online (Sandbox Code Playgroud)

因为jQuery试图为我处理POST.显然,当您在Django中POST到同一个URL并希望手动处理它时,您必须包括

data-ajax="false"
Run Code Online (Sandbox Code Playgroud)