2017-11-24 5 views
0

私は奇妙な動作があります。誰かが何が間違って言うことができますか?AJAXをリフレッシュした後にテンプレートで作業していないユーザー権限がありますか?

テンプレートでは、以下の図のようにオブジェクトのリストを表示します。ユーザーがフォームでデータを追加/編集/削除すると、AJAXによってユーザーのリストが更新されます。

問題は、AJAXボタンによるリフレッシュがリスト内で消えてしまうことです。 {% if perms.foo.do_something %}はAJAXで動作しないようです。何が間違っているとこの問題を解決する方法?

P.S.ブラウザでページをリフレッシュすると同時に、{% if perms.foo.do_something %}が完璧に動作します。権限を正しく表示する。私は混乱しています。 AJAXによるリフレッシュリストの後 enter image description here

:コードの例以下は enter image description here

:開始時

のjavascript:

// Submit Form 
$(function() { 
    var saveForm = function() { 
     var form = $(this); 
     $.ajax({ 
      url: form.attr("action"), 
      data: form.serialize(), 
      type: form.attr("method"), 
      dataType: 'json', 
      success: function (data) { 
       if (data.form_is_valid) { 
        $("#users").html(data.html_users); 
        $("#user-modal").modal("hide"); 
       } 
       else { 
        $("#user-modal .modal-content").html(data.html_form); 
       } 
      } 
     }); 
     return false; 
    }; 

    // Update User Data 
    $("#users").on("click", ".user-edit-btn", loadForm); 
    $("#user-modal").on("submit", ".user-edit-form", saveForm); 
}); 

はviews.py:

class UserEditView(UpdateView): 
    template_name = 'users/edit_user.html' 
    form_class = UserEditForm 
    model = User 
    permission_required = ('auth.change_user') 

    def form_valid(self, form): 
     form.save() 
     data = dict() 
     data['form_is_valid'] = True 
     context = {'users': User.objects.order_by('username')} 
     data['html_users'] = render_to_string('users/users.html', context) 
     return JsonResponse(data) 
    *** 

users.html:テンプレートで

{% for user in users %} 
    <div class="list-group-item" data-id='{{ user.pk }}'> 
     {{ user.username }} ({{ user.email }}) 

     {% if perms.auth.change_user_password %} 
      <button class="btn btn-info user-password-change-btn" data-url="{% url 'user:user_password_change' pk=user.pk %}"> 
       <i class="fa fa-lock"></i> 
      </button> 
     {% endif %} 

     {% if perms.auth.delete_user %} 
      <button class="btn btn-danger user-delete-btn" data-url="{% url 'user:user_delete' pk=user.pk %}"> 
       <i class="fa fa-ban"></i> 
      </button> 
     {% endif %} 

     {% if perms.auth.change_user %} 
      <button class="btn btn-warning user-edit-btn" data-url="{% url 'user:user_edit' pk=user.pk %}"> 
       <i class="fa fa-pencil"></i> 
      </button> 
     {% endif %} 
    </div> 
{% endfor %} 
+0

私の疑問は、あなたの場合は条件 'パーマということです.auth.change_user_password'が満足しない、またはfalseを返す – bipen

+0

あなたの 'context'に' perms'がありますか? 'context'は' users'しか含んでいないようです。 – Sraw

+0

@bipenこの条件は、ページを読み込んだり、ページを更新したりするとTrueを返します。しかし、AJAXだけのユーザーのリストでリフレッシュすると、条件はFalseを返します。 –

答えて

0
from django.contrib.auth.context_processors import PermWrapper 
context = {'users': User.objects.order_by('username'), 
      'perms': PermWrapper(self.request.user)} 
data['html_users'] = render_to_string('users/users.html', context) 

permsあなたが自分自身でHTMLをレンダリングしたい場合は、テンプレートmanual.Docにそれを渡す必要がある、django.contrib.auth.context_processors.PermWrapper対象であるhereです。

Djangoは、プログラムのコンテキストにパーマを追加します。

1.settings.py

TEMPLATES->OPTIONS->context_processors->'django.contrib.auth.context_processors.auth'

'django.contrib.auth.context_processors.auth'の2.code:

def auth(request): 
    """ 
    Returns context variables required by apps that use Django's authentication 
    system. 

    If there is no 'user' attribute in the request, uses AnonymousUser (from 
    django.contrib.auth). 
    """ 
    if hasattr(request, 'user'): 
     user = request.user 
    else: 
     from django.contrib.auth.models import AnonymousUser 
     user = AnonymousUser() 

    return { 
     'user': user, 
     'perms': PermWrapper(user), 
    } 
+0

ありがとう!ありがとう、正確に私が探していたもの: –

+1

私はpermsマニュアルを追加する必要がある理由を更新している、見ている – Ykh

関連する問題