【问题标题】:How to get Filename in DjangoWebApp based on a Model containing FileField?如何根据包含 FileField 的模型在 DjangoWebApp 中获取文件名?
【发布时间】:2019-01-05 22:05:32
【问题描述】:

我正在制作一个电子邮件传递 WebApp,我有一个带有 uploadcsvfileEmail 类,用于将 .csv 联系人文件从用户的计算机上传到服务器位置CONTACT_DIR,我想不通的是如何在我的views.py 中获取保存的contacts_some_char.csv 名称,获取它的名称的目的是让我可以解析电子邮件列表并向他们发送电子邮件。

我的model.py 如下:

class Email(models.Model):
    fromemail = models.EmailField(blank = False, max_length = 254)
    uploadcsvfile = models.FileField(upload_to = 'Contacts', blank = False)
    subject = models.CharField(blank=False,max_length = 254)
    bodyHeading = models.CharField(blank = False,max_length = 254)
    bodytext = models.TextField(blank = False)
    name = models.CharField(blank = False,max_length = 254)

这是我的views.py

def index(request):

    if request.method == 'POST':
        email_form = EmailForm(request.POST, request.FILES)
        if email_form.is_valid():
            email_form.save(commit = True)
            print(Email.uploadcsvfile)
            contacts = Contacts()
            #path = settings.CONTACT_DIR
            f = open(settings.CONTACT_DIR+"/"+str(uploaded_file_name))
            csv_f = csv.reader(f)
            Emails = []
            Names= []
            L_Names = []
            for x in csv_f:
                Emails.append(x[0])
                Names.append(x[1])
                L_Names.append(x[2])
            f.close()
            contacts.ListOfEmails = json.dumps(Emails)
            contacts.ListOfFirstNames = json.dumps(Names)
            contacts.ListOfLastNames = json.dumps(L_Names)
            contacts.save()

这里是forms.py

from django import forms
from dcsvreader.models import Email

class EmailForm(forms.ModelForm):
    class Meta():
        model = Email
        fields = "__all__"

AKA 我如何在views.py 中获得 uploaded_file_name,我在 SO 的各种 QnA 中看到这与 FileDescriptor 有关 但也找不到确切的原因,print(Email.uploadcsvfile)<django.db.models.fields.files.FileDescriptor object at 0x03F7DF90> 作为输出。

【问题讨论】:

    标签: python django web django-models django-views


    【解决方案1】:

    request.FILES 是一个类似字典的对象,包含所有上传的文件,uploadcsvfile 是您发出 POST 请求的。因此,request.FILES['uploadcsvfile'] 会将特定文件保存为 InMemoryUploadedFile 并且它有一个变量 .name 保存文件名

    试试这个,

    file_name = request.FILES['uploadcsvfile'].name
    


    参考
    uploadfile.name
    request.FILES

    【讨论】:

    • 可以,但是如果您可以编辑并添加一点方法,我会接受您的回答。
    【解决方案2】:

    我自己对 django 还很陌生,但它看起来像这里:

    print(Email.uploadcsvfile)
    

    您正在尝试打印类属性而不是实例的属性。 您是否尝试过以下方法?

    print(email_form.uploadcsvfile.name)
    

    【讨论】:

    • 已经尝试过了。得到这个错误:AttributeError at / 'EmailForm' object has no attribute 'uploadcsvfile'
    • Email 是模型,email_form 只是表单
    • email_form.model.uploadcsvfile.name 那么呢?
    猜你喜欢
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 2018-05-30
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 2011-02-10
    相关资源
    最近更新 更多