2015-09-19 6 views
0

Я пишу приложение в Django, чтобы проверить XML на наличие ошибок. Он анализирует каждую строку в XML-файле, создает объект (из класса XMLElement), соответствующий этой строке, проверяет строку на наличие ошибок, генерирует строку, детализирующую ошибку, а затем добавляет ее в список. Вот фрагмент кода, что он делает:Django - kwargs не передаются

try: 
     self.string_list = kwargs['tag_string'].replace("<", "").replace(">", "").split() 
     print self.string_list 
     self.element_name = self.string_list[0] 
    except (ValueError, IndexError) as e: 
     self.errors.append("XMLElement {0} contains an error:{1}".format(self.element_name, str(e))) 

Затем, после того, как это делается разбор файла, класс модели, что функции вызываются из включаются все ошибки в одну строку, а затем создает объект с этим string как аргумент ключевого слова.

print '\n'.join(obj.errors) 
    err_obj = Errors(errors='\n'.join(obj.errors)) 

class Errors(models.Model): 
    errors = models.TextField() 

Всякий раз, когда я печатаю список ошибок из экземпляра XMLElement, ошибка напечатан должным образом. Однако, когда я пытаюсь напечатать ошибку из класса ошибок, используя Errors.objects.all()[n].errors из оболочки django, она возвращает пустую строку unicode. Не только это, но вместо сохранения одного объекта ошибки он сохраняет несколько, где-то между 3 и 5. Какая часть моего кода может вызвать это?

Gist link to the entire file

ответ

0

Я, наконец, смог исправить эту проблему. Делая две вещи:

Первое, что я сделал, это изменение суперкласса класса XMLElement от models.Model до object. Это фиксировало большую часть моей проблемы. Однако это не помогло устранить проблему, когда несколько объектов создавались функцией __init__ моего класса UserFile. Я решил это, переместив создание объектов Errors с UserFile.__init__ на функцию с именем check в views.py

0

Бесполезный ответ об использовании метода сохранения. Не то.

Обновления на основе ваших комментариев: Есть много областей, в вашем коде, которые могут быть причиной такого поведения, в основном это может быть потому, что вы перекрывая __init__(). Переопределение этого метода очень обескураживается в Django, потому что в структуре используются многие способы инициализации экземпляров, которые не находятся под вашим контролем, а также инициализирует модели для разных вещей. Создайте собственные методы класса create(), если вам нужно настроить создание экземпляра.

Еще одна вещь, которую я много видел в своем коде (и это скорее комментарий о том, как вы используете фреймворк, чем что-либо еще), заключался в том, что вы очень легко используете суперкласс класса Model, t действительно сохраняется, как и ваш класс XMLElement: возврат к инициализации может создать много проблем с каркасом.

Мое решение для вас состояло в том, что вы должны проверить поведение вашего алгоритма вне рамок, а затем решить, что вам нужно для сохранения и что просто занимает место в вашей базе данных, а затем обернуть свой код на классы Django и для собственного сате, остановить переопределение (и, прежде всего, создание других объектов в каком-то другом объекте) метод init.

+0

Я, я просто пропустил эту часть кода. –

+0

вы уверены? вы не назовете его на свой gist, строка 56, 57 – fixmycode

+0

Я удалил его для целей отладки, я, должно быть, не поставил его в суть. Тем не менее, вернуть его в код не решает мою проблему. –

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