【问题标题】:Django form is valid() returns falseDjango 表单是有效的()返回 false
【发布时间】:2021-05-21 06:16:36
【问题描述】:

我正在尝试在 Django 中上传多个文件,但遇到了一些错误:form.is_valid() 返回 false。
我试过打印 form.errorrs ,它给了我以下信息:

<ul class="errorlist"><li>uploaded_images<ul class="errorlist"><li>“b&#x27;\xbd\x06D\xcd3\x91\x85,\xdf\xa5K\n&#x27;” is not a valid value.</li></ul></li></ul>

我不确定如何解释这个一般错误。找了好久没找到答案。

编辑:
我还遇到了“此字段为必填项”。错误
也许这个屏幕截图可能有助于调试:

我一定是遗漏了一些简单的东西,但我就是找不到!! 另一双能帮我筛选的眼睛将不胜感激!

views.py

from django.shortcuts import render,redirect
from django.views.generic.edit import FormView
from .forms import BRForm
from .models import *

class BRHomeView(FormView):
    form_class = BRForm
    model = TargetImage
    template_name = 'br/br-home.html'
    context_object_name = 'bankrecon'

    def get(self, request):
        form = BRForm(request.POST, request.FILES)
        return render(request, self.template_name, {'form': form, 'title': 'Bank Reconcilation'})

    def post(self, request, *args, **kwargs):
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        files = request.FILES.getlist('uploaded_images')
        print("POST")
        print(request.POST)
        print("FILES")
        print(request.FILES)
        print(form.errors)
        if form.is_valid():
            form.save()

        return redirect('br-home')

models.py

from django.db import models

# Create your models here.

class UploadedImages(models.Model):
    image_files = models.ImageField(null=True, blank=True, upload_to='images/')

class TargetImage(models.Model):
    invoice_date = models.DateTimeField()
    recon_date = models.DateTimeField()
    uploaded_images = models.ManyToManyField(UploadedImages)

    def __str__(self):
        return self.invoice_date

forms.py

from django import forms
from django.core.validators import FileExtensionValidator
from .models import *

class BRForm(forms.ModelForm):
    class Meta:
        model = TargetImage
        fields = ('invoice_date', 'recon_date', 'uploaded_images')
        widgets = {
            'invoice_date': forms.DateInput(attrs={'type': 'date'}),
            'recon_date': forms.DateInput(attrs={'type': 'date'}),
            'uploaded_images': forms.ClearableFileInput(attrs={'multiple': True, 'accept':'.jpeg, .png, .jpg'}),
        }

相关模板代码:

<div class="mt-5 d-flex justify-content-center">
  <form action="" enctype="multipart/form-data" method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <div class="d-flex justify-content-center">
      <button class="btn btn-success mt-3" type="submit">Submit</button>
    </div>
  </form>
</div>

额外信息:我的 request.POST 和 request.FILES 似乎工作正常:

POST
<QueryDict: {'csrfmiddlewaretoken': ['hiding this'], 'invoice_date': ['2021-02-01'], 'recon_date': ['2021-02-01']}>
FILES
<MultiValueDict: {'uploaded_images': [<InMemoryUploadedFile: first_slide (1).jpg (image/jpeg)>, <InMemoryUploadedFile: fourth_slide (1).jpg (image/jpeg)>]}>

谢谢大家!!

【问题讨论】:

  • 显示模板代码
  • 已添加!请看一看!

标签: python django django-models django-forms


【解决方案1】:

我在您的代码中看到的一些错误:

  • 您正尝试在 get 方法中呈现 POST 请求。
  • 您没有将任何数据从 POST 请求传递到您的表单实例。这就是is_valid() 返回False 的原因。

把你的代码改成这样,看看是否有效:

...
    def get(self, request):
        form = BRForm()
        return render(request, self.template_name, {'form': form, 'title': 'Bank Reconcilation'})

    def post(self, request, *args, **kwargs):
        form = BRForm(request.POST)
        if form.is_valid():
            form.save()

        return redirect('br-home')

【讨论】:

  • 感谢您指出这些错误!我明白你的意思了!让我试试!
  • 我已经尝试过您的回答,不幸的是,在我打印时给出了以下信息:POST 文件 , ]}>
    • uploaded_images
      • “b'fN\r'”不是有效值。
【解决方案2】:

我已经设法解决了这个问题!
链接:https://stackoverflow.com/a/60961015/10732211

我彻底检查了整个事情并按照上面的链接进行操作。可能模型关系有一些不起作用的问题。

views.py

class BRHomeView(FormView):
    # model = TargetImage
    template_name = 'br/br-home.html'
    context_object_name = 'bankrecon'

    def get(self, request):
        form = BRFormExtended()
        return render(request, self.template_name, {'form': form, 'title': 'Bank Reconcilation'})

    def post(self, request, *args, **kwargs):
        form = BRFormExtended(request.POST,request.FILES)
        files = request.FILES.getlist('image_files')

        if form.is_valid():
            print("Form Valid")
            print(form.cleaned_data['invoice_date'])
            print(form.cleaned_data['recon_date'])

            user = request.user
            invoice_date = form.cleaned_data['invoice_date']
            recon_date = form.cleaned_data['recon_date']
            target_image_obj = TargetImage.objects.create(user=user,invoice_date=invoice_date, recon_date=recon_date)
            for file in files:
                UploadedImage.objects.create(target_image=target_image_obj,image_files=file)
        else:
            print("Form Invalid")
        return redirect('br-home')

forms.py

class BRForm(forms.ModelForm):
    class Meta:
        model = TargetImage
        fields = ['invoice_date', 'recon_date']
        widgets = {
            'invoice_date': forms.DateInput(attrs={'type': 'date'}),
            'recon_date': forms.DateInput(attrs={'type': 'date'}),
        }

class BRFormExtended(BRForm):
    image_files = forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple': True}))

    class Meta(BRForm.Meta):
        fields = BRForm.Meta.fields + ['image_files',]

models.py

from django.contrib.auth.models import User
from django.utils import timezone

class TargetImage(models.Model):
    user = models.OneToOneField(User,on_delete=models.CASCADE)
    uploaded_date = models.DateTimeField(default=timezone.now)
    invoice_date = models.DateTimeField()
    recon_date = models.DateTimeField()

    def __str__(self):
        return self.user.__str__()

class UploadedImage(models.Model):
    target_image = models.ForeignKey(TargetImage, on_delete=models.CASCADE)
    image_files = models.ImageField(null=True, blank=True, upload_to='images/')

此外,拥有一个媒体根文件夹会很有帮助,并且还需要对 urls.py 进行编辑。

urls.py

from django.urls import path
from .views import BRHomeView
from django.conf import settings
from django.conf.urls.static import static


urlpatterns = [
    path('', BRHomeView.as_view(), name='br-home'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

settings.py

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')


STATIC_URL = '/static/'
STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"),)

希望这会对某人有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 2015-04-17
    • 2019-07-20
    相关资源
    最近更新 更多