2011-07-22 18 views
8

Trong Django, tôi đang sử dụng một định dạng nội tuyến với can_order = True, trên một mô hình có order_with_respect_to được đặt. Tôi đã thiết lập kéo và thả trên giao diện người dùng, kết quả là các trường biểu mẫu tự tạo của Django (mà tôi đã ẩn) thay đổi để phản ánh thứ tự mới. Tôi đã xác minh tôi đang POST thứ tự mới một cách chính xác cho máy chủ, nhưng Django dường như bỏ qua nó, và lưu các mô hình theo thứ tự ban đầu. Các trường _order được tạo tự động trong cơ sở dữ liệu không bao giờ thay đổi.Làm cách nào để bạn lưu thứ tự của một tập hợp nội tuyến django?

Tôi làm cách nào để có được Django để lưu các mô hình sử dụng thứ tự được chỉ định trong bộ định dạng? Tôi có cần phải làm bất cứ điều gì đặc biệt khác ngoài việc gọi số save() trên bộ định dạng không?

Trả lời

2

Tôi đã có cùng một vấn đề và sau khi đào thông qua các nguồn Django figured rằng đó là một cái gì đó bạn cần phải làm một mình.

thực hiện ban đầu của tôi nhìn một cái gì đó như thế này:

services = service_formset.save(commit=False) 
for service in services: 
    # ... do something with m2m relationships ... 
    service.save() 

Tuy nhiên, như bạn đã thấy điều này không đặt ORDER. Vì vậy, thay vào đó, việc triển khai của tôi bây giờ trông giống như:

for form in service_formset: 
    service = form.save(commit=False) 
    # ... do something with m2m relationships ... 
    service.order_order = form.cleaned_data['ORDER'] 
    service.save() 

Trong ví dụ trên 'order_order' là trường tôi đang sử dụng để theo dõi thứ tự trên các mô hình của mình.

Cũng nên nhớ rằng bạn cần phải xác định thuộc tính 'đặt hàng' của lớp Meta của mô hình của bạn để đảm bảo rằng khi bạn tạo lại bộ định dạng, các phần tử theo đúng thứ tự.

class Service(models.Model): 
    # ... 
    order_order = models.IntegerField(default=0) 
    class Meta: 
     ordering = ['order_order',] 
4

Giải pháp đề xuất Evan Borgstrom không hoạt động cùng với can_delete = True.

Đây là giải pháp của tôi, mà cũng làm việc với can_delete = True:

for instance in formset.save(commit=False): 
    # ... do something with m2m relationships ... 
for form in formset.ordered_forms: 
    form.instance.order = form.cleaned_data['ORDER'] 
    form.instance.save() 
+2

Nếu bạn đang sử dụng 'tài sản order_with_respect_to', bạn cũng có thể sử dụng set_RELATED_order()' phương pháp 'để thiết lập trật tự. Tôi sử dụng smth như thế: 'step.set_stepmaterial_order ([form.instance.pk cho biểu mẫu trong self.formset.ordered_forms])' –

Các vấn đề liên quan