2013-07-17 35 views
5

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 formI 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?

+4

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

+4

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. –

+0

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

Trả lời

1

Tôi cũng gặp sự cố này và đã bối rối về nó một lúc. Lỗi của tôi giống nhau - rằng tôi đã thiếu các trường cần thiết trên trường input.

Để xem những gì các lĩnh vực thực sự cần thiết là, một điều rất tốt đẹp để làm là, trong trường hợp này:

from base.forms import DocumentForm ## or put whatever the name is of the app, which is unspecified in the question 
print DocumentForm() 

này sẽ in html mà bạn cần, bao gồm tất cả các thẻ đối tượng này đòi hỏi. Chức năng rất gọn gàng mà tôi đã bỏ lỡ lần đầu tiên, nhưng được nêu trong the docs.

+0

Bạn có thể đưa ra một ví dụ không? – shenk

3

Kiểm tra xem bạn đã thêm tài sản enctype vào thẻ form chưa.

Ví dụ từ official docs: <form enctype="multipart/form-data" method="post" action="/foo/">

+0

Giải pháp hoàn hảo. enctype = "multipart/form-data" đã làm điều đó cho tôi. Thực sự hữu ích . Cảm ơn @Kuznetsov – Doogle

Các vấn đề liên quan