2015-08-23 2 views
1

iam новичок с Django, и у меня есть проблема, которую я пока не могу решить, даже если у меня есть понимание того, что не происходит.Django Modelform, изменяющий ввод пользователя перед проверкой

У меня есть модель с HStore полевой

models.py

--------

class myModel(models.Model): 

    myVariable = HStoreField() 

forms.py

----- ---

class myModel(forms.ModelForm): 

class Meta: 
     model = myModel 
     fields = (
        'myVariable', 
       ) 

вот что я пытаюсь достичь. Я хочу, чтобы пользователю ввести через запятую список О.Б. строк в примере ввода пользователя в поле HStore может быть

«» «String1, String2, String3, String4„“» (без квот)

что я пытаюсь сделать, это преобразовать этот «список/строку» в формат соответствия JSON в качестве словаря, учитывая, что в этом случае он должен выглядеть так:

{"String1": "", "String2": "" , "String3": "", "String4": ""}

Я написал для этого функцию. Логика функции должна работать, и я знаю, что она не работает, потому что если функция is_valid() вызывается в представлении, функция clean() запускается после проверки, в любом случае здесь функция.

forms.py на вершине "класса мета:"

def clean(self): 

    cleaned_data = self.cleaned_data 
    str_inputTags = cleaned_data.get('act_tags_Hstore') 

    if str_inputTags: 

     # Splitting the input String into a list of tags 
     list_tags = str_inputTags.split(",") 

     # Construct JSON Dict string out of the list of tags 
     for tag in list_tags: 
      str_inputJSON = "\"%s\": \"\", " % (tag) 

     # Remove the last added comma and space from the string 
     str_inputJSON = str_inputJSON[:-2] 
     # Add { in front and } to the back of the entered string  
     str_inputJSON = "{" + str_inputJSON + "}" 

     # Setting the cleaned_data to the newly constructed string 
     cleaned_data['act_tags_Hstore'] = str_inputJSON 

     return cleaned_data 

Вот ошибки я получаю в виде

Не удалось загрузить данные в формате JSON.

До сих пор я считаю, что то, что я пытаюсь сделать, не будет работать в рамках чистого метода, и ни в методе clean_field1, я, вероятно, не должен выполнять описанную выше операцию до вызова метода to_python. Поскольку прямо сейчас поле проверяется до вызова метода/clean. Но я не понимаю, как это сделать в данный момент.

+0

Но ... этот код не может работать. Возьмите его вне контекста формы, и вы увидите ряд логических ошибок, не в последнюю очередь из-за которых вы повторно переписываете 'str_inputJSON' без конкатенации. Во всяком случае, у Python есть отличная библиотека 'json' для создания JSON из текста. –

+0

Да, вы правы, цикл должен читаться следующим образом: «для тега в list_tags: str_inputJSON = str_inputJSON +" \ "% s \": \ "\", "% (tag)" – Burnie800

+0

Нет. Что это даже должно быть? Вы не должны создавать JSON путем конкатенации текста * вообще *. Используйте модуль 'json' из стандартной библиотеки. –

ответ

0

У меня проблема. Правильно, как упоминалось в комментариях, моя рутина была неправильной. То, как я решил это, было добавлением charfield с тем же именем в форму и манипулирование строкой, которую я получил в функции clean(), как упоминалось выше, с некоторыми исправлениями. Спасибо всем и особенно Даниэлю Роземан.

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