2012-02-17 33 views
5

Có thể sử dụng một cái gì đó tương tự như các mục quan hệ nội tuyến từ quản trị Django để đại diện cho các mô hình nhúng trong một ListField?Thực hiện một nội tuyến để đại diện cho một ListField trong Django-nonrel

Ví dụ, tôi đã có các mô hình sau:

class CartEntry(model.Model): 
    product_name=model.CharField(max_length=20) 
    quantity = model.IntegerField() 

class Cart(model.Model): 
    line_items = ListField(EmbeddedModelField('CartEntry')) 

Tôi đã thử bằng cách sử dụng nội tuyến tiêu chuẩn, nhưng tôi biết đó là không đúng:

class CartEntryInline(admin.StackedInline): 
    model=CartEntry 

class CartAdmin(admin.ModelAdmin) 
    inlines=[CartEntryInline] 

Nhưng rõ ràng điều đó không' t làm việc, vì không có mối quan hệ khóa ngoại. Có cách nào để làm điều này trong django-nonrel?

Trả lời

0

Điều này không dễ dàng thực hiện trong hộp. Bạn sẽ cần phải quản lý các trường kiểu ListField và EmbeddedModelField trong mô-đun quản trị của Django và thực hiện một số hack để hoàn thành nó. Bạn sẽ phải thực hiện hai phần:

Use EmbeddedModelField in Django's admin

Bạn cần phải xác định một lớp học để xử lý đối tượng EmbeddedModelField để làm cho nó làm việc với quản trị viên của Django. Here là liên kết nơi bạn có thể tìm thấy mã mẫu tuyệt vời. Dưới đây chỉ là khối mã cho trình diễn:

Thêm lớp này vào tập tin models.py bạn và sử dụng EmbedOverrideField thay vì EmbeddedModelField trong Cart mô hình:

class EmbedOverrideField(EmbeddedModelField): 
    def formfield(self, **kwargs): 
     return models.Field.formfield(self, ObjectListField, **kwargs) 

Thực hiện một lớp trong forms.py rằng có hai phương pháp:

class ObjectListField(forms.CharField): 
    def prepare_value(self, value): 
     pass # you should actually implement this method 

    def to_python(self, value): 
     pass # Implement this method as well 

Use ListFields in Django's admin

Bạn cũng cần định nghĩa một lớp xử lý đối tượng ListField để làm cho nó hoạt động với quản trị viên của Django. Here là liên kết nơi bạn có thể tìm thấy mã mẫu tuyệt vời. Dưới đây chỉ là khối mã cho trình diễn:

Thêm lớp này vào tập tin models.py của bạn và ItemsField thay vì ListField trong Cart mô hình:

class ItemsField(ListField): 
    def formfield(self, **kwargs): 
     return models.Field.formfield(self, StringListField, **kwargs) 

Thực hiện một lớp trong forms.py rằng có hai phương pháp:

class StringListField(forms.CharField): 
    def prepare_value(self, value): 
     pass # you should actually implement this method 

    def to_python(self, value): 
     pass # Implement this method as well 
Các vấn đề liên quan