Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django form is valid()返回false_Python_Django_Django Models_Django Forms - Fatal编程技术网

Python Django form is valid()返回false

Python Django form is valid()返回false,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,我试图在Django中进行多个文件上载,但遇到了一些错误:form.is_valid()返回false 我已尝试打印form.erorrs,它提供了以下信息: <ul class="errorlist"><li>uploaded_images<ul class="errorlist"><li>“b&#x27;\xbd\x06D\xcd3\x91\x85,\xdf\xa5K\n&#x27;” i

我试图在Django中进行多个文件上载,但遇到了一些错误:form.is_valid()返回false
我已尝试打印form.erorrs,它提供了以下信息:

<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>

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
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/')

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'}),
        }
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',]

相关模板代码:

<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>

{%csrf_令牌%}
{{form.as_p}}
提交
额外信息:我的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)>]}>

POST
文件夹

谢谢大家

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

  • 您正试图在
    get
    方法中呈现POST请求
  • 您没有将POST请求中的任何数据传递给表单实例。这就是为什么
    是有效的()
将您的代码更改为类似以下内容,然后查看它是否有效:

。。。
def get(自我,请求):
form=BRForm()
返回呈现(请求,self.template_name,{'form':form,'title':'Bank recognition'})
def post(自我、请求、*args、**kwargs):
form=BRForm(request.POST)
如果form.is_有效():
form.save()
返回重定向('br-home')

我已经设法解决了这个问题
链接:

我彻底检查了整个过程,并遵循了上面的链接。可能模型关系存在一些不起作用的问题

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')
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

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'}),
        }
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.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
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/')

此外,有一个媒体根文件夹会很有帮助,还需要编辑URL.py

url.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)
设置.py

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


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

希望这将有助于某人

显示已添加的模板代码!请看一看!感谢您指出这些错误!我明白你的意思了!让我试试!我尝试了您的答案,但不幸的是,在打印时给出了以下内容:POST文件
  • 上传的图像
    • “b';fN\r';”不是有效值。