2015-08-13 2 views
0

Как данные из настраиваемого поля, которые не являются частью модели, загружаются в базу данных? Я имею эту модельзагрузить пользовательское поле, которое не входит в модель в базу данных

модель-CompoundSynonym

compound = models.ForeignKey('MDictionary', blank=False, null=True) 
synonym_type = models.ForeignKey('SynonymType') 
synonym_name = models.CharField(max_length=50, blank=True, null=True, help_text=u'Synonym for the compound') 


def __unicode__(self): 
    return u'%s' % (self.synonym_name) 

И у меня есть form.py, чтобы добавить пользовательские поля к модели. Пользовательское поле - это fileField, который принимает текстовый файл с именами synonym_names. Это настраиваемое поле позволяет загружать более одного имени synonym_ для конкретного соединения и synonym_type.

модель текстовый файл

Rege574574 
Rege337483 
Rege394837 
Rege348389 

В теории каждый раз, когда я нажимаю сохранить со страницы adminx Я хочу файл, который будет проанализирован и synonym_name из файла вставляется для конкретного соединения, synonym_type.

Но в моем случае загружается synonym_name в исходной (модели) формы (который пуст, когда я даю файл)

Это то, что у меня есть:

form.py

class CompoundSynonymForm(ModelForm): 
    file_upload = FileField(required=False) 
    print "YES" 


    def save(self, commit=True): 

     file_upload = self.cleaned_data.get('file_upload', None) 
     print file_upload 

     with open("../../Downloads/model_file_upload.txt", 'r') as f: 
      print "here " 
      model_file = File(f) 
      names = model_file.read() 
      name_list = names.split('\n') 
      for each_name in name_list: 
       if each_name != 'Header': 
       <this is where I have to save them> 

     class Meta: 
      model = CompoundSynonym 

Я получаю анализ файла и имена из файла, но я не смог сохранить их в базе данных. Как мне переписать имя синонима из modelform в мои имена из файла?

UPDATE

with open("../../Downloads/model_file_upload.txt", 'r') as f: 
      print "here " 
      model_file = File(f) 
      names = model_file.read() 
      name_list = names.split('\n') 
      for each_name in name_list: 
       if each_name != 'Header': 
        obj = super(CompoundSynonymForm, self).save(commit=False) 
        obj.synonym_name = each_name 
        if commit: 
         obj.save() 
        return obj 

Это экономит только первую строку файла.

+0

Что именно это нужно в вашей базе данных? Можете ли вы опубликовать полную модель и полную форму, пожалуйста, – e4c5

+0

Я опубликовал полную форму и полную модель – djpy

ответ

0

Что вы делаете в блоке with, на самом деле не имеет большого смысла. Вы создаете экземпляр нового объекта формы, по какой-то причине передавая ему имена, которые вы проанализировали из файла вместо обычных данных POST. Затем вы изменяете имя синонима вашей модели класса с тем же списком имен. Наконец, вы игнорируете все это и называете метод сохранения суперкласса существующей формы.

Вместо того, чтобы все это, что вы хотите сделать, это просто изменить объект, который возвращается из суперкласса сохранить, назначая список имен:

with open("../../Downloads/model_file_upload.txt", 'r') as f: 
    model_file = File(f) 
    names = model_file.read() 
obj = super(CompoundSynonymForm, self).save(commit=False) 
obj.synonym_name = names 
if commit: 
    obj.save() 
return obj 

Хотя я не совсем уверен, что это то, что Вы хотите сделать; Я предполагаю, что вы действительно хотите просмотреть файл, чтобы найти синоним, который соответствует значению внешнего ключа, но вы не указали какой-либо код для этого.

+0

Я хочу сохранить имена из файла в базу данных для данного типа синонимов. Например: synonym_type == Rege и составное имя - это «XYZ», все данные из файла должны быть связаны с соединением «XYZ» и «synge_type» Rege. – djpy

+0

Но ваше поле 'synonym_name' составляет всего 50 символов. Сколько данных в файле? –

+0

У него может быть 100 имен. Они разделились на новый символ линии. каждое имя длиной не более 50 символов. – djpy

Смежные вопросы