Django表单有效且始终为false

Django表单有效且始终为false,django,django-forms,Django,Django Forms,在django应用程序中,即使我添加了与admin应用程序中相同的数据,表单也不会返回true。My model.py看起来像: from django.db import models from django.db.models import ImageField, signals from django.dispatch import dispatcher from django.forms import ModelForm # Create your models here. class

在django应用程序中,即使我添加了与admin应用程序中相同的数据,表单也不会返回true。My model.py看起来像:

from django.db import models
from django.db.models import ImageField, signals
from django.dispatch import dispatcher
from django.forms import ModelForm

# Create your models here.
class Image(models.Model):
    emailAddress = models.EmailField(max_length=75)
    image = ImageField(upload_to='photos')
    caption = models.CharField(max_length=100)

class UploadForm(ModelForm):
    class Meta:
        model = Image
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render_to_response
from competition.models import Image, UploadForm

# Create your views here.

def index(request):
    images = Image.objects.all().order_by('emailAddress')
    return render_to_response('images/index.html', {'images': images})

def uploadImage(request):
    if request.method == 'POST': # If the form has been submitted...
        form = UploadForm(request.POST) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
            emailAddress = form.cleaned_data['emailAddress']
            image = form.cleaned_data['image']
            caption = form.cleaned_data['caption']
            i = Image(emailAddress=emailAddress, image = image, caption = caption)
            i.save()
            return HttpResponseRedirect('../image/')
        else:
            return render_to_response('images/upload.html', {'form': form})
    else:
        form = UploadForm() # An unbound form
        return render_to_response('images/upload.html', {'form': form})
<html>
<body>
    <form enctype="multipart/form-data" action="/image/uploadImage" method="post">{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Submit" />
    </form>
    </body>
</html>
My views.py看起来像:

from django.db import models
from django.db.models import ImageField, signals
from django.dispatch import dispatcher
from django.forms import ModelForm

# Create your models here.
class Image(models.Model):
    emailAddress = models.EmailField(max_length=75)
    image = ImageField(upload_to='photos')
    caption = models.CharField(max_length=100)

class UploadForm(ModelForm):
    class Meta:
        model = Image
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render_to_response
from competition.models import Image, UploadForm

# Create your views here.

def index(request):
    images = Image.objects.all().order_by('emailAddress')
    return render_to_response('images/index.html', {'images': images})

def uploadImage(request):
    if request.method == 'POST': # If the form has been submitted...
        form = UploadForm(request.POST) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
            emailAddress = form.cleaned_data['emailAddress']
            image = form.cleaned_data['image']
            caption = form.cleaned_data['caption']
            i = Image(emailAddress=emailAddress, image = image, caption = caption)
            i.save()
            return HttpResponseRedirect('../image/')
        else:
            return render_to_response('images/upload.html', {'form': form})
    else:
        form = UploadForm() # An unbound form
        return render_to_response('images/upload.html', {'form': form})
<html>
<body>
    <form enctype="multipart/form-data" action="/image/uploadImage" method="post">{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Submit" />
    </form>
    </body>
</html>
我的模板看起来像:

from django.db import models
from django.db.models import ImageField, signals
from django.dispatch import dispatcher
from django.forms import ModelForm

# Create your models here.
class Image(models.Model):
    emailAddress = models.EmailField(max_length=75)
    image = ImageField(upload_to='photos')
    caption = models.CharField(max_length=100)

class UploadForm(ModelForm):
    class Meta:
        model = Image
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render_to_response
from competition.models import Image, UploadForm

# Create your views here.

def index(request):
    images = Image.objects.all().order_by('emailAddress')
    return render_to_response('images/index.html', {'images': images})

def uploadImage(request):
    if request.method == 'POST': # If the form has been submitted...
        form = UploadForm(request.POST) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
            emailAddress = form.cleaned_data['emailAddress']
            image = form.cleaned_data['image']
            caption = form.cleaned_data['caption']
            i = Image(emailAddress=emailAddress, image = image, caption = caption)
            i.save()
            return HttpResponseRedirect('../image/')
        else:
            return render_to_response('images/upload.html', {'form': form})
    else:
        form = UploadForm() # An unbound form
        return render_to_response('images/upload.html', {'form': form})
<html>
<body>
    <form enctype="multipart/form-data" action="/image/uploadImage" method="post">{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Submit" />
    </form>
    </body>
</html>

{%csrf_令牌%}
{{form.as_p}}

我可以让它正常工作,如果我使用管理应用程序,但需要一个通用的形式,这不工作,因为它不断要求一个电子邮件地址或图像(错误出现在图像字段上方)。那么为什么我的表单可能无效呢?

您需要使用request.FILES和request.POST来实例化表单


另外,您可以保存模型表单,而不是在视图中手动创建图像。

您有所需的图像,但没有将文件数据绑定到表单

form = UploadForm(request.POST)
应该是

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

请参见

文件字段图像字段字段有两个需要注意的地方:

  • 表单元素中需要
    enctype=“多部分/表单数据”
  • 请参阅:


    @Cat Plus Plus,我已经添加了CSRF令牌,错误仍在发生。为什么这会带来不同?我认为is_valid的概念是检查数据的有效性。这没有很好的文档记录。是的,我试过了,但是ofc不起作用,所以我现在要修改。文档对我来说很清楚。请记住,Django是一个开源项目。打开一张罚单,提出如何改进文档的建议,比在堆栈溢出评论中批评文档更有建设性。