Django 上传 PDF 并邮寄

问题描述 投票:0回答:1

所以我想使用 Django 编写一个网站,任何人都可以申请成为

agents
company
。要申请,他们需要填写一份表格,上传简历,然后邮寄给人力资源部。现在我的代码似乎没有采用
pdf
,因为它在点击提交后返回
none
。而且邮件也没有发送出去。我怎样才能解决这个问题?预先感谢!

我的html:

<form method="POST" action="{% url 'apply' %}" class="row" enctype="multipart/form-data">
        {% csrf_token %}
        <div class="mb-3 col-lg-6">
        <input type="text" class="form-control" placeholder="Name" name ="name">
        </div>
        <div class="mb-3 col-lg-6">
        <input type="text" class="form-control" placeholder="Email Address" name ="email">
        </div>
        <div class="mb-3 col-lg-6">
        <input type="text" class="form-control" placeholder="Subject" name ="subject">
        </div>
        <div class="mb-3 col-lg-6">
        <input type="text" class="form-control" placeholder="Phone" name ="phone">
        </div>
        <div class="mb-3 col-lg-6">
            <input id="CV" type="file" class="form-control" placeholder="CV" name ="CV" aria-label="CV">
        </div>
        <div class="mb-3 col-lg-6">
            <input type="text" class="form-control" placeholder="Address" name ="address">
        </div>
        <div class="mb-3 col-lg-12">
        <textarea name id cols="30" rows="5" class="form-control"  name ="cover_letter" placeholder="Cover Letter..."></textarea>
        </div>
        <div class="mb-3 col-lg-12">
        <input type="submit" class="btn btn-primary" value="Apply">
        </div>
</form>

我的观点.py:

def apply(request):
    if request.method == "POST":
        name = request.POST['name']
        email = request.POST['email']
        subject = request.POST['subject']
        phone = request.POST['phone']
        CV = request.POST.get('CV')
        address = request.POST['address']
        cover_letter = request.POST.get('cover_letter')

        application = "Name: " + name + "  " + "Phone: " + phone + "  " + "Email: " + email + "  " + "Address: " + address + "  " + "Subject: " + subject


        send_mail(
            'Application of ' + name,
            application,
            CV,
            cover_letter,
            email,
            ['[email protected]'],
            )

        return render(request, 'users/apply.html', {
            'name' : name,
            'email' : email,
            'phone' : phone,
            'address' : address,
            'subject' : subject,
            'cover_letter' : cover_letter,
            'CV' : CV,
            })
    else:
        return render(request, 'blog/index.html', {})

我的设置.py:

EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"
django django-models django-views django-templates
1个回答
0
投票

在 Django 中,上传的文件是通过

request.FILES
访问的,而不是 request.POST。因此,您应该使用
request.FILES.get('CV')
检索上传的文件。

您与

send_mail
使用的参数似乎不正确。
send_mail
本身不支持使用您提供的参数将文件作为附件发送。要发送带有附件的电子邮件,您应该使用
EmailMessage
类。

以下是调整视图的方法。py:

from django.core.mail import EmailMessage
from django.conf import settings
    def apply(request):
        if request.method == "POST":
            name = request.POST['name']
            email = request.POST['email']
            subject = request.POST['subject']
            phone = request.POST['phone']
            address = request.POST['address']
            cover_letter = request.POST.get('cover_letter')
            cv_file = request.FILES.get('CV')
    
            application = f"Name: {name}\nPhone: {phone}\nEmail: {email}\nAddress: {address}\nSubject: {subject}\nCover Letter: {cover_letter}"
    
            email_message = EmailMessage(
                f'Application from {name}',
                application,
                settings.DEFAULT_FROM_EMAIL,
                ['[email protected]'],  
            )
    
            # Attach the CV if it exists
            if cv_file:
                email_message.attach(cv_file.name, cv_file.read(), cv_file.content_type)
    
            email_message.send()
    
            return render(request, 'users/apply.html', {
                'name': name,
                'email': email,
                'phone': phone,
                'address': address,
                'subject': subject,
                'cover_letter': cover_letter,
                'CV': cv_file,
            })
    
        else:
            return render(request, 'blog/index.html', {})
© www.soinside.com 2019 - 2024. All rights reserved.