Tôi hoàn toàn bối rối về điều này và phải làm điều gì đó cực kỳ ngu ngốc. Tôi đang cố gắng để tải lên một tập tin trên một dự án Django. Vấn đề có vẻ là dữ liệu biểu mẫu NO đang được chuyển tới máy chủ - chỉ có mã thông báo csrf. Tôi đang chạy Django 1.5.1, python 2.7, virtualenv, trên máy Mac và sử dụng máy chủ phát triển Django tích hợp.request.FILES luôn trống khi tải lên tệp
dạng HTML của tôi là:
{% load url from future %}
<form enctype="multipart/form-data" method="POST" action="{% url 'showreport' %}">
{% csrf_token %}
<label>Upload grade csv file: </label>
<input type="hidden" id="testing" value="maybe" />
<input type="file" id="grade_csv" />
<input type="submit" value="Generate Report" />
</form>
mô hình của tôi:
from django.db import models
class Document(models.Model):
file = models.FileField(upload_to='/media/', blank=True, null=True)
forms.py của tôi:
from django import forms
from .models import Document
class DocumentForm(forms.Form):
"""
to handle uploading grades csv file
"""
class Meta:
models = Document
views.py của tôi:
def report(request):
"""
Process the CSV file to remove inactive students
Manipulate to get right JSON format
Chart the results
"""
if request.method == 'POST':
form = DocumentForm(request.POST, request.FILES)
if form.is_valid():
newfile = Document(file = request.FILES['file'])
newfile.save()
classdata = {}
studentdata = {}
return render(request, 'report/showreport.html', { 'classdata': classdata, 'studentdata': studentdata })
else:
form = UploadFileForm()
return render(request, 'report/index.html', { 'form': form })
Tôi đã dành vài giờ để tìm kiếm giải pháp, nhưng không có gì có vẻ hiệu quả. I have the enctype set correctly (Tôi nghĩ), I am using input type 'submit' for the form và I am binding the form data to my model (không quan trọng, vì request.FILES trống). Tôi cũng đã thử sử dụng url trực tiếp trong hành động biểu mẫu của tôi (action = '/ report/showreport /') cho mỗi this Django newbie page, nhưng điều đó không tạo ra sự khác biệt. Theo như tôi có thể nói, không có kịch bản nào khác ràng buộc với hành động gửi biểu mẫu và ghi đè hành động mặc định.
Tôi cũng nhận ra rằng mã ở trên hầu hết sẽ là request.FILES ['grades_csv'] khớp với id đầu vào của biểu mẫu ... nhưng điều đó cũng không quan trọng, vì request.FILES trống.
Khi cố gắng gỡ lỗi, tôi đã đặt dấu vết pdb ngay trước if request.method == "POST" trong chế độ xem của tôi. Sử dụng giao diện điều khiển, tôi có thể thấy yêu cầu của mình.POST không bao gồm đầu vào "thử nghiệm" bị ẩn của tôi và yêu cầu đó.FILES trống. Khi tôi chạy điều này trong một trình duyệt, nó chỉ trả về cho tôi vào trang biểu mẫu của tôi, về cơ bản nói rằng biểu mẫu của tôi không hợp lệ. kết quả pdb tôi đang ở đây:
(Pdb) request.FILES
(Pdb) <MultiValueDict: {}>
(Pdb) request.POST['testing']
(Pdb) *** MultiValueDictKeyError: "Key 'testing' not found in <QueryDict: {u'csrfmiddlewaretoken': [u'0tGCChxa3Po619dCi114Sb9jmWRt82aj']}>"
(Pdb) request.POST
<QueryDict: {u'csrfmiddlewaretoken': [u'0tGCChxa3Po619dCi114Sb9jmWRt82aj']}>
Nếu tôi cố gắng truy cập request.FILES trong views.py của tôi mà không kiểm tra nếu các hình thức có giá trị, tôi nhận được lỗi này:
"Key 'file' not found in <MultiValueDict: {}>"
Tôi bối rối và đánh giá cao bất kỳ sự giúp đỡ nào về lý do tại sao tôi không thể làm được điều này - có vẻ như nó phải đơn giản. Tôi có thể tự tạo và ghi vào các tập tin trong thư mục dự án của tôi bằng cách sử dụng pdb, vì vậy tôi không nghĩ rằng quyền truy cập là vấn đề ... vấn đề là trong các hình thức?
Hình như dạng html của bạn là mất tích tên các thuộc tính trong các lĩnh vực đầu vào của bạn, hãy thử như – Jingo
Một vài điều đáng ngờ đối với tôi. Đầu vào biểu mẫu của bạn thiếu thuộc tính 'name'. Bạn đang phân lớp 'forms.Form' nhưng có một lớp' Meta' cho biết bạn muốn 'forms.ModelForm'. Nếu bạn có ý định sử dụng một mẫu biểu mẫu, bạn không cần phải khởi tạo một đối tượng Document vì biểu mẫu thực hiện điều này cho bạn. –
Genius - cảm ơn! Tôi rất vui khi được chấp nhận như là câu trả lời nếu bạn gửi nó như là một ... – user