Tôi đã gặp vấn đề này với hai dự án tôi đã làm việc trong một thời gian ngắn. Đối với giải pháp ví dụ của tôi, tôi có một "Biểu mẫu" có nhiều "Biến" được gán cho nó và thứ tự của các biến trên biểu mẫu cần phải được sắp xếp. Vì vậy, tôi đã thực hiện như sau:
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
Mấu chốt từ trên là VariableOrder CommaSeparatedIntegerField là nơi chúng ta sẽ lưu trữ thứ tự của các biến trên Form, và chúng ta sẽ được sử dụng nó như là một danh sách python, đó là lý do tại sao mặc định là [].
Đối với mẫu, tôi hiển thị Biến của mình ở dạng mà chúng tôi sẽ thực hiện kéo và thả có thể sắp xếp (các phần tử danh sách mà tôi thực sự sử dụng có thêm kiểu dáng và thông tin liên quan đến CSS).
<ul id="sortable">
{% for Variable in VarList %}
<li id="{{ Variable.id }}">{{ Variable }}</li>
{% endfor %}
</ul>
Bây giờ chúng tôi sẽ thực hiện kéo và thả danh sách cho việc thay đổi thứ tự. Để làm việc này bạn cần phải có đoạn AJAX CSRF từ trang web Django vào đầu
$(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();
});
Phần quan trọng trên là "cập nhật" gọi hàm mỗi khi có sự thay đổi vị trí của bất kỳ các biến, sẽ gửi AJAX. toArray trên sortable cùng với stringify JSON được chúng tôi gửi từ trên xuống dưới của mỗi biến, được sử dụng bởi khung nhìn như sau. Lưu ý: Tôi giữ đối tượng Form đang hoạt động dưới dạng biến phiên, nhưng trong trường hợp khác, bạn chỉ cần gọi đối tượng Biểu mẫu mà bạn muốn thay đổi thứ tự.
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
Mấu chốt của tất cả điều này là bạn có thể sử dụng CommaSeparatedIntegerField này như một danh sách bằng cách đánh giá chuỗi.Ví dụ:
Thêm một biến:
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()
Loại bỏ một Variable:
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()
Rendering các biến trong tự:
aForm = Form.objects.get(id=1)
currentOrder = aForm.VariableOrder
currentOrder = eval(currentOrder)
VarList = []
for i in currentOrder:
VarList.append(Variable.objects.get(id=i))
Đây là bản nháp đầu tiên về những gì tôi sẽ sử dụng, nhưng nó hoạt động tốt cho tôi. Sự cải thiện rõ ràng đầu tiên là việc đánh giá danh sách python là một phương thức trong lớp. ví dụ.
def getVarOrder(self):
return eval(self.VariableOrder)
và sau đó chỉ cần gọi Form.getVarOrder() khi muốn thao tác danh sách. Trong mọi trường hợp, hy vọng điều này sẽ giúp ích.
JD
Tốt. Nhắc tôi về số dòng trong BASIC. :-) –