2017-07-20 6 views
1

フラスコ管理者が新しく、削除ボタンを編集ビューに移動する必要があります。フラスコ管理 - ビューを編集するために削除ボタンを移動

ここに他のビューが継承しているAdminModelViewクラスがあります。

class AdminModelView(sqla.ModelView): 
    can_view_details = True 


    # column_extra_row_actions = [ViewRowAction()] 

    def is_accessible(self): 
     if not current_user.is_active or not current_user.is_authenticated: 
      return False 
     if current_user.can('administrator'): 
      return True 
     return False 

    def _handle_view(self, name, **kwargs): 
     """ 
     Override builtin _handle_view in order to redirect users when a view is not accessible. 
     """ 
     if not self.is_accessible(): 
      if current_user.is_authenticated: 
       # permission denied 
       abort(403) 
      else: 
       # login 
       return redirect(url_for('auth.login', next=request.url)) 
      print(self._edit_form_class) 


    def get_list_row_actions(self): 
     """ 
      Return list of row action objects, each is instance of 
      :class:`~flask_admin.model.template.BaseListRowAction` 
     """ 
     actions = [] 

     if self.can_view_details: 
      if self.details_modal: 
       actions.append(template.ViewPopupRowAction()) 
      else: 
       actions.append(template.ViewRowAction()) 

     return actions + (self.column_extra_row_actions or []) 

私が編集を取り、リストビューのオフボタンを削除するget_list_row_actionsを再定義しました。 AdminModelViewクラスの一部が変更できるかどうか、または編集フォームのテンプレートを変更する必要があるかどうかは疑問です。

+0

これも解決しますか。あなたは答えを見つけましたか? – Sparrowcide

+0

「/ delete」エンドポイントを記述してボタンをテンプレートに追加する必要がありました。今すぐ回答を投稿する。 –

答えて

1

私のソリューション:

class AdminModelView(sqla.ModelView):

@expose('/delete', methods=('DELETE',)) 
def delete_view(self): 
    """ 
     Delete model 
    """ 
    id = request.args.get('id') 
    if id is None: 
     return jsonify({"success": False}), 404 
    model = self.get_one(id) 
    db.session.delete(model) 
    db.session.commit() 
    flash("{0} deleted".format(model)) 
    return jsonify({"success": True}), 200 

に新しいエンドポイントを書いたが、削除ボタンとエディットビュー・テンプレートへのモーダルをレンダリングするためにこれらのマクロを使用します。

{% if admin_view.can_delete and model %} 
    {{ add_modal_button(url='#', title='Delete', content='Delete', modal_window_id='delete_modal', btn_class='btn btn-danger') }} 
{% endif %} 

{% macro delete_modal() %} 
<div class="modal fade" id="delete_modal" tabindex="-1" role="dialog"> 
    <div class="modal-dialog" role="document"> 
     {# bootstrap version > 3.1.0 required for this to work #} 
    <div class="modal-content"> 
     <div class="panel panel-danger"> 
     <div class="panel-heading">Delete Record</div> 
     <div class="panel-body"> 
      <p>You are about to delete this record. This action cannot be undone.</p> 
      <p>Would you like to proceed?</p> 
     </div> 
     <div class="panel-footer text-center"> 
      <button type="button" class="btn btn-secondary" id="cancel_delete">Cancel</button> 
      <button type="button" class="btn btn-danger" id="confirm_delete">Delete</button> 
     </div> 
     </div> 
    </div> 
    </div> 
</div> 
{% endmacro %} 

ハイブリッドJinja2とJavaScript。これはリファクタリングする必要があります。 {{model.id}}をDOMに格納し、AJAX要求が行われる前にjQueryで取得できます。

$("#cancel_delete").click(function() { 
    $("#delete_modal").modal("toggle") 
}); 

$("#confirm_delete").click(function() { 
    $.ajax({ 
    url: "../delete?id={{ model.id }}", 
    method: "DELETE" 
    }).done(function() { 
    window.location.replace("{{ return_url }}"); 
    }).fail(function() { 
    $(".actions-nav").before(
     '<div class="alert alert-danger alert-dismissable fade in">' + 
     '<a href="#" class="close" data-dismiss="alert" aria-label="close">&times;</a>' + 
     '<strong>Error:</strong> This object failed to delete.' + 
     '</div>' 
    ) 
    }) 
}) 
関連する問題