2010-10-20 16 views
23

bunu yaparken içinde admin modelform verdiği bir veritabanına bir csv dosyasını almak için denedim:İthalat CSV veri

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) 

Formlar. 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) 

Ancak "file_to_import" alanına koyduğum dosyayı almaya çalışırken sıkışmış durumdayım. AttributeError'ı forms.py'de alma: 'function' nesnesinin 'FILES' özelliği yoktur. ben yanlış yapıyorum ne

?

cevap

16

uzun bir ara sonra ben bir cevap buldu:

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() 

görünü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)) 

dinlenme parçasıdır

Formu standart formu kullanarak yönetici içinde bir görünüm oluşturma Bu yazının: http://web.archive.org/web/20100605043304/http://www.beardygeek.com/2010/03/adding-views-to-the-django-admin/

+3

archive.org at Bağlantı öldü, ama hala hayatta: http://web.archive.org/web/20100605043304/http://www.beardygeek.com/2010/03/adding-views-to-the-django- admin/ – askvictor

+0

alternatif bağlantı http://note.harajuku-tech.org/adding-views-to-the-django-admin-beardy-geek – madmed

+0

verileri() bazı özel django aracı sınıf veya kendi veri modeli nedir? – andi

1

save() yönteminde, istek nesnesine erişiminiz yoktur - içeri aktarılmadığını görebilirsiniz. Normalde orada bir NameError olmasını beklersiniz, ancak bir işleviniz olduğundan şüpheleniyorum dosya başka yerde request() denir. tasarruf noktada

, tüm ilgili veriler cleaned_data olmalıdır: yani sen open gidince ise başka bir sorun olacağı anlamına noktasında,

file_csv = self.cleaned_data['file_to_import'] 

yapmak gerekir - file_to_import sunucu dosya sistemindeki bir dosya olmadığı için bunu yapamazsınız, istemciden akışa alınmış bir bellek içi dosyadır. file_csv'u doğrudan csv.reader'a geçirebilmeniz gerekir.

+0

Haklısın. Ancak şimdi bir AttributeError'ım var: 'DataImport' nesnesinin 'clear_data' özelliği yok. Ayrıca, bazı sorunlardan kaçınmak için, tüm model alanlarına "boş = True" ekledim. Tavsiyede teşekkürler! – aldeano

3

0 bakabilirsiniz, ne isterseniz tam olarak ne yapar - bir XLS (bir CSV değil, ancak önemli değil) yükleyebilir ve model alanlarına sütun atamanıza izin verir. Varsayılan değerler de desteklenmektedir. Eğer yönetimde kullanılan varsayılan model formunu değiştirmek gerekmez çünkü

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

Ayrıca, elle tek tek kayıtları değiştirme imkanı ortadan kaldırmaz.

+0

Kullanımdan bir kaç örnek verebilir misiniz? – andi