2012-06-13 29 views
7

Mô hình của tôi:Tiếp cận nhiều nhiều "thông qua" các lĩnh vực liên quan trong Formsets

class End_User(models.Model): 
    location = models.ForeignKey(Location) 
    first_name = models.CharField(max_length=70, blank=True, null=True) 
    email_address = models.CharField(max_length=70, blank=True, null=True) 

class Phone_Client(models.Model): 
    end_user = models.ManyToManyField(End_User) 
... 
    extensions = models.CharField(max_length=20) 

class Line(models.Model): 
    phone_client = models.ManyToManyField(Phone_Client, through='Phone_Line') 
    .... 
    voicemail = models.BooleanField(default=False) 

class Phone_Line(models.Model): 
    phone_client = models.ForeignKey(Phone_Client) 
    line = models.ForeignKey(Line) 
    line_index = models.IntegerField() 

Vì vậy, về cơ bản Một người dùng cuối có thể có nhiều điện thoại, một chiếc điện thoại có thể có nhiều dòng, liên quan thông qua Phone_line.

Trang của tôi cần phải có tất cả các đối tượng này có thể chỉnh sửa và các phiên bản mới đã tạo thời gian chạy cho Phone_Clients và Line tất cả trong cùng một trang. Hiện tại tôi đang tạo một biểu mẫu mô hình End_User đơn giản và các đối tượng modelformset_factory cho Phone_Client và Lines. Vì một chiếc điện thoại có thể có nhiều dòng, mỗi dạng điện thoại trong phone_formset có thể có một đối tượng dạng dòng. Tôi hiện đang làm một cái gì đó như thế này

end_user = End_User.objects.get(pk=user_id) 
user_form = End_UserForm(instance=end_user) 

Phone_ClientFormSet = modelformset_factory(Phone_Client,form=PartialPhone_ClientForm, extra=0, can_delete=True) 

phone_clients_formset = Phone_ClientFormSet(queryset=end_user.phone_client_set.all(), prefix='phone_client') 

all_lines = modelformset_factory(Line, form=PartialLineForm, extra=0, can_delete=True) 

phone_clients = end_user.phone_client_set.all() 

client_lines_formsets = {} 
for phone in phone_clients: 
    client_lines_formsets[phone.id] = all_lines(queryset=phone.line_set.all(), prefix='phone_client_'+str(phone.id)) 

Tôi đang sử dụng danh sách này để hiển thị các dòng thuộc một phone_client trong mẫu sử dụng bộ định dạng.

Tôi đã những câu dưới đây, trên các mô hình

  1. Tôi có thể sử dụng nhà máy inline_formset để xử lý nhiều đối với nhiều mối quan hệ có chứa một thông qua lớp học? nếu vậy làm thế nào để tôi làm điều đó cho Phone_Client, Line và Phone_Line thông qua quan hệ?

  2. Tôi cần hiển thị line_index cho một kết hợp đường dây, điện thoại cụ thể, làm cách nào để thực hiện điều đó trong mẫu? Tôi đã xem
    How do I access the properties of a many-to-many "through" table from a django template? Tôi không muốn chỉ hiển thị, nhưng liên kết giá trị với điện thoại, kết hợp đường nếu có thể trong dòng hoặc số điện thoại, sao cho người dùng thay đổi chỉ mục, tôi có thể lưu dữ liệu đó vào dữ liệu cơ sở trong khi đăng dữ liệu biểu mẫu.

Tôi mới dùng django nên mọi trợ giúp đều thực sự được đánh giá cao. Cảm ơn !!

Trả lời

14

Như bạn có thể đã biết, bạn không thể chỉnh sửa mối quan hệ nhiều-nhiều với các biểu mẫu nội tuyến. Tuy nhiên, bạn có thể chỉnh sửa mô hình thông qua. Vì vậy, đối formset nội tuyến của bạn, bạn chỉ cần thiết lập các mô hình để thông qua mô hình, ví dụ .:

inlineformset_factory(Phone_Client, Line.phone_client.through) 

line_index sẽ thực sự là một lĩnh vực có thể nhìn thấy trên hình thức inline, vì vậy bạn thực sự không cần phải làm gì cả. Nếu ai đó thay đổi chỉ mục, nó sẽ được lưu khi các biểu mẫu nội tuyến được lưu, giống như phần còn lại của các trường.

+0

Cảm ơn bạn đã trả lời. Tôi sẽ thử cái này !! – akotian

+0

Tôi đã thử điều này và nó hoạt động cho tôi. Tuy nhiên, một câu hỏi, tôi sẽ phải xử lý riêng biệt bộ định dạng Line và formlet nội tuyến ở trên phải không? – akotian

+0

Tôi có nghĩa là một trang có thể có nhiều điện thoại, có thể có nhiều dòng, vì vậy tôi xử lý logic này trong mẫu. Tương tự như vậy tôi sẽ phải sử dụng các mẫu ngay để hiển thị line_index bên cạnh các dòng? – akotian

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