2017-03-09 12 views
0

私は私がすべてのページのためにそれを再利用できるように、私のbase.htmlテンプレートで私のレジスタを表示するために、これを使用し、以下の機能セッションでフォームを保存して取得しますか?

def include_user_create(request): 

    if 'form' not in request.session: 
     form = CreateUserForm() 
    else: 
     form = request.session['form'] 

    return { 'create_user_form' : form } 

context_processor.pyファイルを持っています。関数CREATE_USERはフォームは、彼らが内に表示することができるので、私はcontext_processorは、フォームを再利用できるようにエラーを保存する目的のために、フォームを保存したい無効である場合は、フォームが

def create_user(request): 

    form = CreateUserForm(request.POST or None, request.FILES or None) 

    if request.method == 'POST': 

     if form.is_valid(): 
      user = form.save(commit=False)    
      user.save()   
      user = authenticate(username=user.email, password=user.password) 
     else: 
      request.session['form'] = form #<--- save 

    next = request.POST.get('next', '/') 
    return HttpResponseRedirect(next) 

を提出扱いテンプレート。これを行う

は私にエラーを与える:

TypeError: <CreateUserForm bound=True, valid=False, fields=(email;password;confirm_password)> is not JSON serializable 

が、これは何とか仕事を得るために、それは可能ですか?

答えて

1

フォームオブジェクトがJSONシリアライザブルではなく、デフォルトセッションシリアライザがserializers.JSONSerializerであるため、このエラーが発生します。

あなたsettings.pyにピクルスのシリアライザにそれを変更しよう:

SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer' 

EDIT:この設定で

、あなたは漬物のシリアライズを気にする必要はありません、あなただけに持っています書き込み:

request.session['form'] = form 
+0

pickeメソッドのダンプに関するドキュメントが見つかりません。これまで私はrequest.session ['form'] = pickle.dumps(self、form)を持っています。私は関数ベースのビューでこれを実行しています。そしてそれは私に自己が定義されていないことを与えます。 PickleSerializerの使い方を教えてください。 – vandelay

+1

@vandelay私の答えの編集を見てください。 – albar

+0

私はそれを試してみました。それは、をpickleできません:django.utils.text.capfirstと同じオブジェクトではありません。 – vandelay

関連する問題