2014-10-17 4 views
3

3 단계로 등록하면 3 가지 양식이 사용됩니다.양식 간의 데이터 처리

이런 식으로 뭔가, 단지 보여주기 위해 :

@app.route('/form/step1', methods=['GET', 'POST']) 
def form_step1(): 
    form = form_step_1(request.form) 
    ...validate()... 
    return render_template('register.html', form=form) 

@app.route('/form/step2', methods=['GET', 'POST']) 
def form_step2(): 
    form = form_step_2(request.form) 
    ...validate()... 
    return render_template('register.html', form=form) 

@app.route('/form/step3', methods=['GET', 'POST']) 
def form_step3(): 
    form = form_step_3(request.form) 
    ...validate()... 
    return render_template('register.html', form=form) 

이 세 단계 사이의 데이터를 처리하는 올바른 방법은 무엇입니까? 모든 데이터는 3 단계의 끝에서 데이터베이스에 커밋해야합니다. 그러나 양식 사이의 뒤로 작업은 이전 양식을 다시 채워야합니다.

세션을 사용하는 것이 좋지 않습니다.

+0

모든 단계가 끝나기 전에 데이터베이스에 저장하지 않는 이유는 무엇입니까? –

+0

@ m170897017 가능성은 있지만 조금 지루합니다. 이 경우 동일한 레지스트리를 여러 번 업데이트해야합니다. 예제에서 2, 3 단계는 SQL 업데이트입니다. – user455318

+0

일부 클래스 변수에 양식의 내용을 저장하고 3 단계의 끝에서 데이터베이스에 저장할 수 있습니까? –

답변

3

을 조사하려면

나는 개인적으로 한 형태에서 다른 형태로 데이터를 전달하는 세션 객체를 사용하는 것이 좋습니다 것입니다. 소량의 데이터가있는 경우 플라스크에있는 쿠키 구현을 사용하면 문제를 해결할 수 있습니다. 그렇지 않으면 you can override the default sessions object to store sessions data server side using Redis. This lets you use session objects without paying the price of storing lots of data in cookies. 이것은 다음과 같이 할 수 있음을 의미합니다.

@app.route('/form/step1', methods=['GET', 'POST']) 
def form_step1(): 
    form1 = form_step_1(request.POST) 
    user_id = current_user.user_id # If you're using flask-login 
    ...validate()... 
     # dictionary that holds form1, form2, etch 
     form_data = {"form1": form1, "form2": None, "Form3"=None} 
     flask.session[user_id] = form_data 
     redirct_to(url_for("form_step2")) 
    return render_template('register.html', {'form':form1}) 

@app.route('/form/step2', methods=['GET', 'POST']) 
def form_step2(): 
    form1 = session[user_id][form1] 
    # A simpler way than passing the whole form is just the data 
    # you want but for this answer I'm just specifying the whole form. 
    form = form_step_2(form1) 
    user_id = current_user.user_id # If you're using flask-login 
    ...validate()... 
     # dictionary that holds form1, form2, etch 
     flask.session[user_id]["form2"] = form2 
     redirct_to(url_for("form_step3")) 
    return render_template('register.html', form=form) 
+0

또 다른 방법은 아마도 각 단계의 데이터를 일시적으로 저장하기 위해 [flask-redis] (https://github.com/rhyselsmore/flask-redis)를 사용할 수 있습니다. Redis는 이것을 위해 만들어졌습니다. – user455318

+0

전적으로 동의합니다. 개인적으로 세션 객체를 사용하는 것은 제 응용 프로그램이 이미 세션에서 데이터를 검색하고 일관성있게 보입니다. 그러나 flask-redis를 사용하는 것은 완전히 유효한 선택입니다. – AlexLordThorsen

+0

내 양식이 "JSON 직렬 가능하지 않습니다"라는 오류가 발생합니다 어떻게이 문제를 극복합니까? – user805981

0

양식 데이터의 POST 도용에 대해 걱정할 필요가없는 경우 두 번째 및 세 번째보기에서 숨겨진 양식 필드를 사용하여 데이터를 전달할 수 있습니다. ... 이러한 라인을 따라 생각 양식이 유효한 경우, 이전 단계에서 각 양식의 데이터를 사용할 수 있으며, 3 단계에서 POST로 전환

forms.py 
# override EACH form's init to change the widget for each field to a hidden widget if is_hidden kwarg passed. 

class form_step_1(forms.Form): 

    def __init__(self, *args, **kwargs): 
     is_hidden = kwargs.pop('is_hidden', None) 
     super(FormName, self).__init__(*args, **kwargs) 
     if is_hidden: 
      for field in self.fields: 
       self.fields[field].widget = forms.HiddenInput() 

# Be sure to do this for each form with hidden input needed 


views.py 

@app.route('/form/step1', methods=['GET', 'POST']) 
def form_step1(): 
    form1 = form_step_1(request.POST) 
    ...validate()... 
    return render_template('register.html', {'form':form1}) 

@app.route('/form/step2', methods=['GET', 'POST']) 
def form_step2(): 
    form1 = form_step_1(request.POST, is_hidden=True) 
    hidden_forms =[form1] 
    form2 = form_step_2(request.POST) 
    ...validate()... 
    return render_template('register.html', {'form':form2, 'hidden_forms':hidden_forms}) 

@app.route('/form/step3', methods=['GET', 'POST']) 
def form_step3(): 
    form1 = form_step_1(request.POST, is_hidden=True) 
    form2 = form_step_2(request.POST, is_hidden=True) 
    hidden_forms =[form1, form2] 
    form = form_step_3(request.form) 
    ...validate()... 
    if form.is_valid(): 
     # do stuff, save to DB 
     form1.save() 
     form2.save() 
     form3.save() 
     return HttpReturnRedirect('/success_page/') # Always Redirect after posting form 
    # if not valid, show again. 
    return render_template('register.html', {'form':form, 'hidden_forms':hidden_forms }) 


template.html (assuming you are using a single template for each page 

<form action="." etc> 
    {% csrf_token %} 
    {{ form }} 
    {% for each_form in hidden_forms %} 
     {{ each_form }} 

    <!-- your submit button --> 
</form> 

이제. 당신이 무모한 솔루션 (즉 좀 더 작업이 필요), Django FormWizard

+2

숨겨진 양식이 세션보다 더 나빠 보인다. 어쨌든, 나는 플라스크와 wtforms, django에 대해 이야기하고 있습니다. – user455318