2016-12-13 26 views
1

In Flask有一個iframe顯示fancybox的登錄窗體,它工作正常,但如果有錯誤,我想重新加載窗體。問題是當我提交錯誤的表單時,它會在當前的iframe中加載另一個iframe。如何在當前的iframe中加載表單。我如何重新加載fancybox iframe窗體Flask中有錯誤

@user.route('/signin', methods=['GET', 'POST']) 
def signin(): 
    """ Login a user 
    """ 
    form = SigninForm(request.form) 
    if request.method == 'POST' and form.validate(): 
     username = form.username.data 
     password = form.password.data 

     if username: 
      try: 
       user = User.objects.get(username = username) 
      except User.DoesNotExist: 
       form.username.errors = ['No such user or password'] 
       context = {'form':form} 
       return render_template('sign-in.html', **context) 

     else: 
      form.username.errors = ['Enter a Username or Email address'] 
      context = {'form':form} 
      return render_template('sign-in.html', **context) 

     if user.check_password(password): 
      login_user(user) 
      return render_template('close-iframe.html') 
     else: 
      form.username.errors = ['No such user or password'] 
      context = {'form':form} 
      return render_template('sign-in.html', **context) 

這裏是Jinja2的模板

{% extends 'base.html' %} 
{% from "_formhelpers.html" import render_field %} 

{% block body_block %} 
<body> 

    <div class="header"> 
     <div class="wrapper"> 
        <div id="sign-in-show""> 
         <div class="signin-form"> 
          <div class="sign-up-in-tabcont" style="display: block;"> 
           <form id="sign-in-form"> 
            {{ form.csrf_token }} 
            <div class="form-single-row"> 
             {{ render_field(form.username, id="email") }} 
            </div> 

            <div class="form-single-row"> 
             {{ render_field(form.password, id="password") }} 
            </div> 

            <div class="form-single-row"> 
             {{ render_field(form.submit, value='Login') }} 
            </div> 

            <div class="form-single-row"> 
             <p class="forget-password"> 
              <a href="{{url_for('user.forgot')}}">Forgot Password?</a> 
             </p> 
            </div> 
           </form> 
           <div class="clear"></div> 
          </div> 
         </div> 
        </div> 

      <div class="clear"></div> 
      <div class="header-outer"></div> 
     </div> 
    </div> 

</body> 
{% endblock %} 

這裏是JavaScript我在主應用程序。它的工作原理,但我不能改變的HTML中的iframe,當它返回

function send_ajax(e){ 
    $.ajax({ type : "POST", 
     cache : false, 
     url: "/signin", 
     data: $(this).serialize(), 
     success:function(data) 
     { 
      var box = $('.fancybox-iframe').contents().find('html'); 
      box.html(data); 
     } 
    }); 

    return false;  
} 

$("#sign-in-form").bind("submit", send_ajax); 
$('.fancybox').fancybox({ onClose: function(){ window.location.reload() } }); 

,並激活它

<a class="fancybox_signin" id="sign-in" href="{{url_for('user.signin')}}">Sign In</a> 
+0

你可以在有fancybox電話的地方發佈你的JavaScript代碼嗎?你是否已經用'target =「_ self」'或'target =「_ parent」'來試試這個表單? – Davebra

+0

問題是,我打電話給你的成功函數的另一個fancybox,你打開一個ajax調用的結果fancybox,你有一個iframe類型的fancybox打開。 你可以嘗試使用'location.reload();'而不是'$ .fancybox(data);'來簡單地更新你的成功函數中iframe的內容嗎? – Davebra

+0

我試過了,它只重載了原件。我也試過這樣做$('body',$('。fancybox-iframe')。contents())。html(data);看看它是否會改變框內的html,但它沒有 – CrabbyPete

回答

0

經過大量的實驗,我終於理解了它的HTML。

function send_ajax(e){ 
    $.ajax({ type : "POST", 
     cache : false, 
     url: "/signin", 
     data: $(this).serialize(), 
     success:function(data) 
     { 
      parent.jQuery.fancybox(data); 
     } 
    }); 

    return false;  
} 

$("#sign-in-form").on("submit", send_ajax); 

這隻有一個問題。如果您輸入錯誤的密碼兩次,第二個窗口不會出現。