2016-12-21 2 views
0

У меня есть список шрифтов, которые я хочу отправить через множественный флажок, и я хочу показать все выбранные флажки на другой странице. Когда я отправлю форму, я получаю эту ошибку:Как упорядочить несколько полей флажков, чтобы форма могла быть отправлена ​​правильно?

[<Font: Space Mono>, <Font: Fruktur>] is not JSON serializable 

Как я могу отправить свою форму без этой проблемы?

views.py

def step1(request): 
    initial={'fn': request.session.get('fn', None), 'checkbox': request.session.get('checkbox', (False,))} #cookies 
    form = PersonForm(request.POST or None, initial=initial) 
    if request.method == 'POST': 

     if form.is_valid(): 
      request.session['fn'] = form.cleaned_data['fn'] 
      request.session['checkbox'] = form.cleaned_data['checkbox'] #probably this line is wrong, how can I serialize it ? 
      return HttpResponseRedirect(reverse('step2')) 
    return render(request, 'step1.html', {'form': form}) 

forms.py

class CustomChoiceField(forms.ModelMultipleChoiceField): 
    def label_from_instance(self, obj): 
     return mark_safe('%s' % (obj.font_name)) 

class PersonForm(forms.ModelForm): 
    checkbox = CustomChoiceField(widget=forms.CheckboxSelectMultiple, queryset=Font.objects.all()) 

    class Meta: 
     model = Person 
     fields = ['fn', 'checkbox'] 

Любое предложение?


Update: Джанго Traceback

TypeError at /multistep/step1/ 

[<Font: Space Mono>, <Font: Fruktur>] is not JSON serializable 

Request Method:  POST 
Request URL: http://127.0.0.01:8000/multistep/step1/ 
Django Version:  1.8.17 
Exception Type:  TypeError 
Exception Value:  

[<Font: Space Mono>, <Font: Fruktur>] is not JSON serializable 

Exception Location:  C:\Python34\lib\json\encoder.py in default, line 173 
Python Executable: C:\Python34\python.exe 
Python Version:  3.4.4 
Python Path:  

['C:\\Python34\\projects\\fyzai', 
'C:\\Python34\\lib\\site-packages\\django_flickr-0.3.5-py3.4.egg', 
'C:\\Python34\\lib\\site-packages\\oauth2-1.9.0.post1-py3.4.egg', 
'C:\\Python34\\lib\\site-packages\\django_taggit_templatetags-0.4.6.dev0-py3.4.egg', 
'C:\\Python34\\lib\\site-packages\\django_taggit-0.20.2-py3.4.egg', 
'C:\\Python34\\lib\\site-packages\\bunch-1.0.1-py3.4.egg', 
'C:\\Python34\\lib\\site-packages\\django_templatetag_sugar-1.0-py3.4.egg', 
'C:\\Python34\\lib\\site-packages\\aldryn_newsblog-1.3.0-py3.4.egg', 
'C:\\WINDOWS\\SYSTEM32\\python34.zip', 
'C:\\Python34\\DLLs', 
'C:\\Python34\\lib', 
'C:\\Python34', 
'C:\\Python34\\lib\\site-packages'] 

Server time: Wed, 21 Dec 2016 00:22:08 +0000 
Traceback Switch to copy-and-paste view 

    C:\Python34\lib\site-packages\django\core\handlers\base.py in get_response 

            response = middleware_method(request, response) 

     ... 
    ▶ Local vars 
    C:\Python34\lib\site-packages\django\contrib\sessions\middleware.py in process_response 

              request.session.save() 

     ... 
    ▶ Local vars 
    C:\Python34\lib\site-packages\django\contrib\sessions\backends\db.py in save 

           session_data=self.encode(self._get_session(no_load=must_create)), 

     ... 
    ▶ Local vars 
    C:\Python34\lib\site-packages\django\contrib\sessions\backends\base.py in encode 

          serialized = self.serializer().dumps(session_dict) 

     ... 
    ▶ Local vars 
    C:\Python34\lib\site-packages\django\core\signing.py in dumps 

          return json.dumps(obj, separators=(',', ':')).encode('latin-1') 

     ... 
    ▶ Local vars 
    C:\Python34\lib\json\__init__.py in dumps 

          **kw).encode(obj) 

     ... 
    ▶ Local vars 
    C:\Python34\lib\json\encoder.py in encode 

          chunks = self.iterencode(o, _one_shot=True) 

     ... 
    ▶ Local vars 
    C:\Python34\lib\json\encoder.py in iterencode 

          return _iterencode(o, 0) 

     ... 
    ▶ Local vars 
    C:\Python34\lib\json\encoder.py in default 

          raise TypeError(repr(o) + " is not JSON serializable") 

     ... 
    ▶ Local vars 
+0

Любое предложение? да пост MCVE. включают полную стек. Что такое класс для шрифта? вы используете DRF, если нет, что такое сериализатор? – e4c5

+0

@ e4c5 Извините, я начинаю с django, что такое stacktrace и MCVE или DRF? – Lindow

+0

для stacktrace и drf google. для другого http://stackoverflow.com/help/how-to-ask – e4c5

ответ

0

Полный трассировки стека показывает, что это сеанс промежуточного слоя, что вызывает эту ошибку сериализации. А это, в свою очередь, в деле по следующим направлениям

request.session['fn'] = form.cleaned_data['fn'] 
request.session['checkbox'] = form.cleaned_data['checkbox'] #probably this line is wrong, how can I serialize it ? 

Опять же это не очевидно, как это может произвести эту ошибку, но глядя на вашей форме это показывает, что существует шрифт QuerySet, который сериализация. Для этого вам нужно установить специальный сериализатор, но подключить его к сеансу будет сложно. Вместо этого, почему бы не просто:

checkbox = CustomChoiceField(widget=forms.CheckboxSelectMultiple, queryset=Font.objects.all().values()) 

В этом случае вы должны изменить obj.font_name к OBJ [ ''] font_name

+0

, он дает мне эту ошибку вместо другой, «dict», объект не имеет атрибута 'font_name' – Lindow

+0

см. обновление. Почему вы все равно сохраняете этот материал на сеансе? – e4c5

+0

попробовал, когда я отправлю форму, все флажки автоматические, проверит себя и покажу мне это '' ['id', 'font_link', 'font_family', 'font_name'] "не является допустимым значением для первичного ключа.' – Lindow