2016-10-08 4 views
0

Я пытаюсь внедрить CSV Import в Django Admin и сохранять массивные данные, соответствующие строкам файла CSV.Django Custom Admin Form bulk save implmentation

Это мой Администратор класс:

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 

Это моя форма класс:

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

Мой класс Сотрудник:

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

EDIT Я понимаю, мне нужно поместить вызов super.save, но я не могу понять, куда поместить вызов, потому что doc говорит, что метод сохранения сохраняет и возвращает экземпляр. Но в моем случае нет единого экземпляра, который суперкласс может сохранять и возвращать. Кого я здесь не хватает?

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

Ok. Поэтому я добавил следующее после моих для цикла: 'супер (EmployeeForm, самость) .save (* аргументов, ** kwargs)' Теперь он дает мне следующее исключение: '(1048,«Колонок " user_id 'не может быть null ")' – R4chi7

+1

@ R4chi7 Это может быть проблема с тем, как вы создаете/используете модель 'User'. – noteness

+0

Метод 'CreateEmployee' отлично работает, когда я запускаю его через оболочку Django. Я попытался проанализировать запросы, которые выполняются в обоих случаях. Запросы при сохранении через admin: http://pastebin.com/a8qNPd03. Запросы при сохранении через оболочку: http://pastebin.com/ipT99d5m. Некоторые дополнительные запросы выполняются в случае администратора. – R4chi7