【问题标题】:Django file input from Forms not reaching model来自表单的 Django 文件输入未达到模型
【发布时间】:2019-12-12 22:44:37
【问题描述】:

我是 django 的菜鸟,无法在我的代码中找出问题所在。基本上我正在尝试使用表单将一些图像上传到我的服务器。每当我保存表单时,它只会采用模型中指定的默认图像,而不是我在表单中上传的图像。

print(request.Files) 在调用 form.is_valid() 之前给出的输出为:

<MultiValueDict: {'id_image01': [<InMemoryUploadedFile: image01.jpg (image/jpeg)>], 'id_image02': [<InMemoryUploadedFile: image02.jpg (image/jpeg)>], 'id_image03': [<InMemoryUploadedFile: image04.jpg (image/jpeg)>], 'id_image04': [<InMemoryUploadedFile: image07.jpg (image/jpeg)>]}>

我认为图像已正确加载到内存中。

我的代码是这样的:

views.py

def create_puzzle(request):

    if request.method == 'POST':
        print(request.FILES)
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            puzzleImages= form.save(commit=False)
            puzzleImages.username= request.user.username
            puzzleImages.save()
            return redirect('/puzzle/index.html')
    else:
        form = DocumentForm()
    return render(request, 'puzzle/create_puzzle.html', {
        'form': form
    })

我的 Forms.py

class DocumentForm(forms.ModelForm):
    class Meta:
        model = Document
        fields = ('birthday_message', 'video_url', 'image01',
            'image02', 'image03','image04',
            'image05', 'image06', 'image07',
            'image08', 'image09', 'image10')
        captcha = ReCaptchaField(
        public_key='###########',
        private_key='###########',
)

我的模型.py

class Document(models.Model):
    description = models.CharField(max_length=255, blank=True)
    image01 = models.ImageField(default='default/image01.png', upload_to=user_directory_path)
    image02 = models.ImageField(default='default/image02.png', upload_to=user_directory_path)
    image03 = models.ImageField(default='default/image03.png', upload_to=user_directory_path)
    image04 = models.ImageField(default='default/image04.png', upload_to=user_directory_path)
    image05 = models.ImageField(default='default/image05.png', upload_to=user_directory_path)
    image06 = models.ImageField(default='default/image06.png', upload_to=user_directory_path)
    image07 = models.ImageField(default='default/image07.png', upload_to=user_directory_path)
    image08 = models.ImageField(default='default/image08.png', upload_to=user_directory_path)
    image09 = models.ImageField(default='default/image09.png', upload_to=user_directory_path)
    image10 = models.ImageField(default='default/image10.png', upload_to=user_directory_path)
    username = models.CharField(max_length=255, blank=False)
    birthday_message=models.CharField(default='Happy Birthday Special One!!!', max_length=500)
    video_url=models.CharField(default='https://www.youtube.com/watch?v=A9jl1yLURp4', max_length=100)


    uploaded_at = models.DateTimeField(auto_now_add=True)


    def save(self, *args, **kwargs):
        #print (self.image01)
        #print(self.birthday_message)

        if not self.id:
            self.image01 = self.compressImage(self.image01, "image01")
            self.image02 = self.compressImage(self.image02, "image02")
            self.image03 = self.compressImage(self.image03, "image03")
            self.image04 = self.compressImage(self.image04, "image04")
            self.image05 = self.compressImage(self.image05, "image05")
            self.image06 = self.compressImage(self.image06, "image06")
            self.image07 = self.compressImage(self.image07, "image07")
            self.image08 = self.compressImage(self.image08, "image08")
            self.image09 = self.compressImage(self.image09, "image09")
            self.image10 = self.compressImage(self.image10, "image10")
        super(Document, self).save(*args, **kwargs)

感谢您的帮助!

【问题讨论】:

  • 嗨@abhisekG你能分享你的html页面吗?

标签: python django


【解决方案1】:
Please add below line of code in your template
<form enctype="multipart/form-data" method="post">
-----
 ----
  ----
  </form>

【讨论】:

  • 嗨@Vaibhav,谢谢你的回答。我已经有了:
    {% csrf_token %}
【解决方案2】:

我找到了问题的原因。我想手动呈现表单字段并用于获取文件。它会正常传递文本输入,但是当涉及到文件时,它不会验证它们。因此,不要使用以下标签:

<input name="id_image03" type="file" class="form-control" id="id_image03">

我做到了:

{{ form.image03 }}

就是这样!

【讨论】:

    猜你喜欢
    • 2018-06-30
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    相关资源
    最近更新 更多