2010-10-20 46 views
23

Tôi đã cố gắng để nhập khẩu một tập tin csv thành một cơ sở dữ liệu bằng cách tinh chỉnh các ModelForm bên trong quản trị làm điều này:nhập csv dữ liệu vào cơ sở dữ liệu trong Django quản

models.py:

class Data(models.Model): 
    place = models.ForeignKey(Places) 
    time = models.DateTimeField() 
    data_1 = models.DecimalField(max_digits=3, decimal_places=1) 
    data_2 = models.DecimalField(max_digits=3, decimal_places=1) 
    data_3 = models.DecimalField(max_digits=4, decimal_places=1) 

Forms. py:

import csv 
class DataImport(ModelForm): 
    file_to_import = forms.FileField() 

    class Meta: 
     model = Data 
     fields = ("file_to_import", "place") 

    def save(self, commit=False, *args, **kwargs): 
     form_input = DataImport() 
     self.place = self.cleaned_data['place'] 
     file_csv = request.FILES['file_to_import'] 
     datafile = open(file_csv, 'rb') 
     records = csv.reader(datafile) 
     for line in records: 
      self.time = line[1] 
      self.data_1 = line[2] 
      self.data_2 = line[3] 
      self.data_3 = line[4] 
      form_input.save() 
     datafile.close() 

Admin.py:

class DataAdmin(admin.ModelAdmin): 
    list_display = ("place", "time") 
    form = DataImport 

admin.site.register(Data, DataAdmin) 

Nhưng tôi đang cố gắng nhập tệp tôi đưa vào trường "file_to_import". Nhận AttributeError trong đối tượng forms.py: 'function' không có thuộc tính 'FILES'.

Tôi đang làm gì sai?

Trả lời

16

Sau khi tìm kiếm từ lâu tôi tìm thấy một câu trả lời: Tạo một cái nhìn bên trong quản trị sử dụng một hình thức tiêu chuẩn

Mẫu:

class DataInput(forms.Form): 
    file = forms.FileField() 
    place = forms.ModelChoiceField(queryset=Place.objects.all()) 

    def save(self): 
     records = csv.reader(self.cleaned_data["file"]) 
     for line in records: 
      input_data = Data() 
      input_data.place = self.cleaned_data["place"] 
      input_data.time = datetime.strptime(line[1], "%m/%d/%y %H:%M:%S") 
      input_data.data_1 = line[2] 
      input_data.data_2 = line[3] 
      input_data.data_3 = line[4] 
      input_data.save() 

Quan điểm:

@staff_member_required 
def import(request): 
    if request.method == "POST": 
     form = DataInput(request.POST, request.FILES) 
     if form.is_valid(): 
      form.save() 
      success = True 
      context = {"form": form, "success": success} 
      return render_to_response("imported.html", context, 
      context_instance=RequestContext(request)) 
    else: 
     form = DataInput()   
     context = {"form": form} 
     return render_to_response("imported.html", context, 
     context_instance=RequestContext(request)) 

Phần còn lại là phần của bài đăng này: http://web.archive.org/web/20100605043304/http://www.beardygeek.com/2010/03/adding-views-to-the-django-admin/

+3

Liên kết đã chết, nhưng vẫn còn hoạt động tại archive.org: http://web.archive.org/web/20100605043304/http://www.beardygeek.com/2010/03/adding-views-to-the-django- admin/ – askvictor

+0

liên kết thay thế http://note.harajuku-tech.org/adding-views-to-the-django-admin-beardy-geek – madmed

+0

Dữ liệu() là một số lớp công cụ django đặc biệt hoặc mô hình dữ liệu của riêng bạn? – andi

1

Trong phương thức save(), bạn không có quyền truy cập vào đối tượng yêu cầu - bạn có thể thấy rằng nó không được chuyển vào. Thông thường bạn sẽ có một NameError ở đó, nhưng tôi nghi ngờ rằng bạn đã có một hàm ở nơi khác trong tập tin gọi là request().

Tại thời điểm tiết kiệm, tất cả các dữ liệu có liên quan phải ở trong cleaned_data: vì vậy bạn nên có thể làm

file_csv = self.cleaned_data['file_to_import'] 

Vào thời điểm đó bạn sẽ có một vấn đề khác, đó là khi bạn nhận được để open - bạn không thể làm điều đó, vì file_to_import không phải là tệp trên hệ thống tệp của máy chủ, đó là tệp trong bộ nhớ đã được phát trực tiếp từ ứng dụng khách. Bạn sẽ có thể chuyển trực tiếp file_csv tới csv.reader.

+0

Bạn nói đúng. Nhưng bây giờ tôi đã có một AttributeError: 'DataImport' đối tượng không có thuộc tính 'cleaned_data'. Ngoài ra, chỉ để tránh một số vấn đề, tôi đã thêm một "blank = True" trong tất cả các trường của mô hình. Cảm ơn lời khuyên! – aldeano

3

Hãy xem django-admin-import, ít nhiều chính xác những gì bạn muốn - bạn có thể tải lên XLS (không phải CSV, nhưng điều đó không quan trọng) và cho phép bạn gán cột cho các trường mô hình. Giá trị mặc định cũng được hỗ trợ.

http://pypi.python.org/pypi/django-admin-import/0.2.1

Bên cạnh đó, nó không lấy đi khả năng để thay đổi hồ sơ cá nhân bằng tay bởi vì bạn không cần phải thay thế các hình thức mô hình mặc định được sử dụng trong quản lý.

+0

Bạn có thể cung cấp một số ví dụ làm việc về cách sử dụng không? – andi

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