首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >尝试使用没有forms.py的文件上传 - 'InMemoryUploadedFile'对象不可调用

尝试使用没有forms.py的文件上传 - 'InMemoryUploadedFile'对象不可调用
EN

Stack Overflow用户
提问于 2019-06-05 03:10:29
回答 1查看 0关注 0票数 0

所以我正在尝试制作一个包含一些数据和上传字段的表单。没有forms.py,Django文档没有提供任何好的教程。我不想用它。

我尝试用他的项目修改他们的forms.py(https://docs.djangoproject.com/en/2.2/topics/http/file-uploads/)教程,但是我收到了一个错误。“InMemoryUploadedFile'对象不可调用”我试过在谷歌搜索但我没有发现这个错误。

我显然想念一些东西,因为当我以前用Node做文件上传时我不得不做更多的事情,比如设置文件存储等。我只是不知道如何在django中处理这个问题。那么我错过了什么,为什么我会收到这个错误?

views.py

代码语言:javascript
复制
def incarcarecv(req):
    context = {
        'title': "title"
    }
    if req.method == 'POST':
        nume = req.POST['nume']
        prenume = req.POST['prenume']
        telefon = req.POST['telefon']
        email = req.POST['email']
        CV = req.FILES['CV']
        cvUpload = CV(solicitant = req.user, nume=nume, prenume=prenume, telefon=telefon, emailContact=email, CV=CV)        
    return render(req, "../templates/pagini/incarcare-cv.html", context)

models.py

代码语言:javascript
复制
class CV(models.Model):
    solicitant = models.ForeignKey(User, on_delete=models.CASCADE)
    dataUploadCV = models.DateField(auto_now_add=True)
    nume = models.CharField(max_length=12)
    prenume = models.CharField(max_length=12)
    telefon = models.CharField(max_length=12)
    emailContact = models.EmailField(max_length=40)
    CV = models.FileField(upload_to='documents/%d/%m/%Y')
    rezolvata = models.BooleanField(default=False)
    def __str__(self):
        return self.solicitant

HTML

代码语言:javascript
复制
{% extends 'base.html' %}
{% load static %}
{% block content %}
            <div class="container container-centru">
                <h1 class="heading-contact">Incarca CV</h1>
                {% include 'partials/_alerts.html' %}
                <form action="{% url 'incarcarecv' %}" method="POST" class="form-contact"  enctype="multipart/form-data">
                    {% csrf_token %}
                        <div class="form-group">
                            <label for="inputnume" class="email-contact">Nume</label>
                            <input type="text" name="nume" class="form-control" id="inputnume" aria-describedby="emailHelp" placeholder="Introdu nume">
                        </div>
                        <div class="form-group">
                                <label for="inputprenume" class="email-contact">Prenume</label>
                                <input type="text" name="prenume" class="form-control" id="inputprenume" aria-describedby="emailHelp" placeholder="Introdu prenume">
                        </div>
                        <div class="form-group">
                            <label for="inputtelefon" class="email-contact">Telefon</label>
                            <input type="text" name="telefon" class="form-control" id="inputtelefon" aria-describedby="emailHelp" placeholder="Introdu telefon">
                        </div>
                        <div class="form-group">
                            <label for="inputemail" class="email-contact">Email</label>
                            <input type="email" name="email" class="form-control" id="inputemail" aria-describedby="emailHelp" placeholder="Introdu email">
                        </div>
                        <div class="form-group">
                                <label for="inputcv" class="email-contact">CV</label>
                                <input type="file" name="CV" class="form-control" id="inputemail" aria-describedby="emailHelp">
                            </div>
                        <div class="form-group form-group-custom">
                                <input type="submit" value="Trimite" class="btn btn-secondary btn-block btn-login-custom">
                                <input type="submit" value="Resetează câmpurile" class="btn btn-secondary btn-block btn-reset-custom">
                        </div>                   
                </form>
            </div>              
{% endblock %}

让我翻译:name =姓氏,prenume =名字,telefon = phone。

那么如何在这种情况下处理文件而不使用forms.py?正如我所说,django没有提供任何相关的教程。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2019-06-05 12:32:35

在你看来,你的影子CV模型中,通过定义一个地方命名的变量CV。的确,你写道:

代码语言:javascript
复制
    CV = req.FILES['CV']

因此,在这种观点,CV没有参考模型CV,但该文件,以后你再调用模型的构造CV(..),但这样调用文件处理程序来代替。

代码语言:javascript
复制
def incarcarecv(req):
    context = {
        'title': 'title'
    }
    if req.method == 'POST':
        nume = req.POST['nume']
        prenume = req.POST['prenume']
        telefon = req.POST['telefon']
        email = req.POST['email']
        cv = req.FILES['CV']
        cv_upload = CV(
            solicitant=req.user,
            nume=nume,
            prenume=prenume,
            telefon=telefon,
            emailContact=email,
        )
        cv_upload.cv.save(cv.name, cv)
        cv_upload.save()
    return render(req, '../templates/pagini/incarcare-cv.html', context)

您将需要cv_upload.save(),否则您构造一个CV对象,但您没有存储在数据库中。

话虽这么说,我强烈建议你使用一个Form,这里看起来很简单ModelForm就足够了。表单还可以验证输入,并产生错误,您可以将错误发送给用户。

通过使用PEP-8命名约定,也不太可能发生此类名称冲突。

如果POST请求成功,您还应该重定向到页面。这是Post / Redirect / Get Web开发模式。否则万一提交成功的,如果你呈现一个页面,用户在浏览器中刷新页面,浏览器会做出同样的POST请求。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100006927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档