2016-10-08 63 views
0

我試圖在Django Admin中實現CSV導入並保存對應於CSV文件行的批量數據。Django自定義管理表單批量保存實施

這是我的聯繫類:

class EmployeeAdmin(admin.ModelAdmin): 
    list_display = ('user', 'company', 'department', 'designation', 'is_hod', 'is_director') 
    search_fields = ['user__email', 'user__first_name', 'user__last_name'] 
    form = EmployeeForm 

這是我的Form類:

class EmployeeForm(forms.ModelForm): 
    company = forms.ModelChoiceField(queryset=Companies.objects.all()) 
    file_to_import = forms.FileField() 

    class Meta: 
     model = Employee 
     fields = ("company", "file_to_import") 

    def save(self, commit=True, *args, **kwargs): 
     try: 
      company = self.cleaned_data['company'] 
      records = csv.reader(self.cleaned_data['file_to_import']) 
      for line in records: 
       # Get CSV Data. 

       # Create new employee. 
       employee = CreateEmployee(...) 

     except Exception as e: 
      raise forms.ValidationError('Something went wrong.') 

我Employee類是:

class Employee(models.Model): 
    user = models.OneToOneField(User, primary_key=True) 
    company = models.ForeignKey(Companies) 
    department = models.ForeignKey(Departments) 
    mobile = models.CharField(max_length=16, default="0", blank=True) 
    gender = models.CharField(max_length=1, default="m", choices=GENDERS) 
    image = models.ImageField(upload_to=getImageUploadPath, null=True, blank=True) 
    designation = models.CharField(max_length=64) 
    is_hod = models.BooleanField(default=False) 
    is_director = models.BooleanField(default=False) 

當我上傳我的文件,然後單擊save ,它顯示我這個錯誤:

'NoneType' object has no attribute 'save'

,出現異常的位置在:

/usr/local/lib/python2.7/dist-packages/django/contrib/admin/options.py in save_model, line 1045

編輯我明白我需要把調用super.save,但我無法揣摩出,將通話,因爲doc表示save方法保存並返回實例。但就我而言,沒有超類可以保存並返回的單個實例。我在這裏失去了什麼?

TIA。

回答

1

你應該只添加super().save()到函數的末尾:

def save(self, *args, commit=True, **kwargs): 
    try: 
     company = self.cleaned_data['company'] 
     records = csv.reader(self.cleaned_data['file_to_import']) 
     for line in records: 
      # Get CSV Data. 

      # Create new employee. 
      employee = CreateEmployee(...) 
     super().save(*args, **kwargs) 
    except Exception as e: 
     raise forms.ValidationError('Something went wrong.') 
+0

確定。所以我說我對循環之後的以下內容: '超(EmployeeForm,個體經營).save(* ARGS,** kwargs)' 現在它給我以下異常: '(1048,「列user_id'不能爲空')' – R4chi7

+1

@ R4chi7這可能是你如何創建/使用User模型的問題。 – noteness

+0

當我通過Django shell運行它時,方法'CreateEmployee'工作正常。我試圖分析兩種情況下正在運行的查詢。通過管理員保存時的查詢是:http://pastebin.com/a8qNPd03。通過shell保存時的查詢如下:http://pastebin.com/ipT99d5m。一些額外的查詢在管理員的情況下運行。 – R4chi7