У меня была эта проблема с двумя проектами, над которыми я работал в последнее время. Для моего примера решения у меня есть «Форма», которой назначено много «Переменных», и порядок переменных в форме должен быть сортируемым. Поэтому я реализовал следующее:
models.py
class Form(models.Model):
FormName = models.CharField(verbose_name="Form Name:", max_length=40)
VariableOrder = models.CommaSeparatedIntegerField(default="[]", editable=False)
def __unicode__(self):
return "%s" % (self.FormName)
class Variable(models.Model):
FormID = models.ForeignKey(Form, default=0, editable=False, related_name="Variable")
VarName = models.CharField(max_length=32, verbose_name="Name of variable in the database:")
def __unicode__(self):
return "%s" % self.VarName
Ключ сверху - VariableOrder. CommaSeparatedIntegerField - это место, где мы собираемся хранить порядок переменных в форме, и мы собираемся использовать его в качестве списка Python, поэтому по умолчанию используется [].
Для шаблона я отображаю свои Переменные в виде, который мы собираемся сделать перетаскиваемым для сортировки (элементы списка, которые я на самом деле использую, имеют гораздо больше стилей, связанных с CSS и информацией о Переменной).
<ul id="sortable">
{% for Variable in VarList %}
<li id="{{ Variable.id }}">{{ Variable }}</li>
{% endfor %}
</ul>
Теперь мы собираемся перетаскивать список для изменения порядка. Чтобы это работало, у вас должен быть фрагмент AJAX CSRF с сайта Django в голове
$(function() {
$("#sortable" ).sortable({
placeholder: "ui-state-highlight",
update: function(event, ui){
$.ajax({
type:"POST",
url:"{% url builder.views.variableorder %}",
data: {Order: JSON.stringify($('#sortable').sortable('toArray')) },
success: function(data){
// Do stuff here - I don't do anything.
}
});
}
});
$( "#sortable" ).disableSelection();
});
Важной частью выше является то, что «update» вызывает функцию каждый раз, когда происходит изменение позиции любой из переменных, которые отправляет AJAX. Метод toArray для sorttable вместе с JSON stringify заставляет нас отправлять идентификаторы сверху вниз для каждой переменной, которая используется представлением следующим образом. Примечание. Я сохраняю активный объект Form как переменную сеанса, но в другом случае вам просто нужно вызвать объект Form, для которого вы хотите изменить порядок.
def variableorder(request):
if request.is_ajax():
Order = request.POST['Order']
updateOrder = request.session['FormID']
updateOrder.VariableOrder = newOrder
updateOrder.save()
request.session['FormID'] = Form.objects.get(id=updateOrder.id)
return HttpResponse("Order changed.")
else:
pass
Ключом всего этого является то, что вы можете использовать этот CommaSeparatedIntegerField в виде списка, оценивая строку. Например:
Добавление переменной :
aForm = Form.objects.get(id=1)
currentOrder = aForm.VariableOrder
currentOrder = eval(currentOrder)
newVar = Variable(stuff in here)
newVar.save()
currentOrder.append(newVar.id)
aForm.VariableOrder = currentOrder
aForm.save()
Удаление переменной :
aForm = Form.objects.get(id=1)
currentOrder = aForm.VariableOrder
currentOrder = eval(currentOrder)
# Variable ID that we want to delete = 3
currentOrder.remove(3)
aForm.VariableOrder = currentOrder
aForm.save()
Отображение переменных в заказе :
aForm = Form.objects.get(id=1)
currentOrder = aForm.VariableOrder
currentOrder = eval(currentOrder)
VarList = []
for i in currentOrder:
VarList.append(Variable.objects.get(id=i))
Это грубый первый набросок того, что я собираюсь использовать, но он хорошо работает для меня. Очевидным первым улучшением является оценка в списке Python, являющаяся методом в классе. например.
def getVarOrder(self):
return eval(self.VariableOrder)
, а затем просто вызовите Form.getVarOrder (), когда хотите манипулировать списком. В любом случае, надеюсь, это поможет.
JD