Q&A
前提・実現したいこと
管理画面上で、店舗オーナーが店舗スタッフの順番を
ドラッグ&ドロップで簡単に並び替えられるようにしたいです。
発生している問題・エラーメッセージ
ブラウザ上で並び替え自体はできるのですが、スタッフの順番データ(order)が更新されません。
該当のソースコード
urls.py
python
1path('ajax/order_change/', ajax_order_change, name='ajax_order_change'), 2 3path('owner<int:owner_id>/store<int:store_id>/staff/', StoreStaffView.as_view(), name='owner_store_staff'), 4
models.py
python
1class Store(models.Model): 2 name = models.CharField(verbose_name='店舗名', max_length=100) 3 4class Staff(models.Model): 5 name = models.CharField(verbose_name='名前', max_length=100) 6 store_id = models.ForeignKey( 7 Store, verbose_name='店舗ID', on_delete=models.CASCADE,) 8 order = models.IntegerField(verbose_name='順序', blank=True, null=True) 9
views.py
python
1def ajax_order_change(request, store_id): 2 order = request.POST.get('order') 3 staff_list = [{ 'pk':staff.pk, 'order': staff.order } for staff in Staff.objects.filter(store_id=store_id)] 4 d = { 5 'staff_list':staff_list 6 } 7 return JsonResponse(d) 8 9class StoreStaffViewView(ListView): 10 model = Staff 11 template_name = 'myapp/owner_store_staff.html' 12 pk_url_kwarg = 'store_id' 13 14 def get_context_data(self, **kwargs): 15 context = super().get_context_data(**kwargs) 16 context['store'] = Store.objects.get(pk=self.kwargs['store_id']) 17 return context
owner_store_staff.html
html
1 2{% block content %} 3 <div id="sortable"> 4 {% for staff in store.staff_set.all %} 5 <div> 6 <p class="order">{{ staff.order }}</p> 7 <p>{{ staff.name }}</p> 8 </div> 9 {% endfor %} 10 </div> 11{% endblock %} 12 13{% block extrajs %} 14<script> 15 function getCookie(name) { 16 var cookieValue = null; 17 if (document.cookie && document.cookie !== '') { 18 var cookies = document.cookie.split(';'); 19 for (var i = 0; i < cookies.length; i++) { 20 var cookie = jQuery.trim(cookies[i]); 21 // Does this cookie string begin with the name we want? 22 if (cookie.substring(0, name.length + 1) === (name + '=')) { 23 cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 24 break; 25 } 26 } 27 } 28 return cookieValue; 29 } 30 31 var csrftoken = getCookie('csrftoken'); 32 33 function csrfSafeMethod(method) { 34 // these HTTP methods do not require CSRF protection 35 return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); 36 } 37 38 $.ajaxSetup({ 39 beforeSend: function (xhr, settings) { 40 if (!csrfSafeMethod(settings.type) && !this.crossDomain) { 41 xhr.setRequestHeader("X-CSRFToken", csrftoken); 42 } 43 } 44 }); 45 46 //order並び替え------------------------------ 47 $('#sortable').sortable(); 48 $('#sortable').bind('sortstop', function (e, ui) { 49 // ソートが完了したら実行される。 50 var rows = $('#sortable .order'); 51 for (var i = 0, rowTotal = rows.length; i < rowTotal; i += 1) { 52 $($('.order')[i]).text(i + 1); 53 } 54 $.ajax({ 55 'url': '{% url "myapp:ajax_order_change" %}', 56 'type': 'POST', 57 'data': { 58 'order': $('.order').val(), 59 }, 60 'dataType': 'json' 61 }); 62 }); 63</script> 64 65{% endblock %}
お分かりになる方、何卒宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2019/03/03 14:09
2019/03/04 10:53
2019/03/11 08:32
2019/03/14 13:52
2019/03/15 09:31
2019/03/15 09:35
2019/03/15 12:02
2019/03/17 03:13