2011-06-21 36 views
16

Tôi có một số Customer s người đặt Appointment s. Mỗi Appointment có chính xác một khách hàng, mặc dù khách hàng có thể được đặt cho nhiều cuộc hẹn xảy ra vào các thời điểm khác nhau.Giải pháp giống như nội tuyến cho Quản trị Django nơi Quản trị viên chứa ForeignKey sang mô hình khác

class Customer(model.Model): 
    def __unicode__(self): 
     return u'%s' % (self.name,) 
    name = models.CharField(max_length=30) 
    # and about ten other fields I'd like to see from the admin view. 

class Appointment(models.Model): 
    datetime = models.DateTimeField() 
    customer = models.ForeignKey("Customer") 
    class Meta: 
     ordering = ('datetime',) 

Bây giờ khi quản trị viên duyệt qua lịch biểu bằng cách xem các cuộc hẹn (theo thứ tự thời gian) trong quản trị viên, đôi khi họ muốn xem thông tin về khách hàng có cuộc hẹn nhất định. Ngay bây giờ, họ sẽ phải nhớ tên của khách hàng, điều hướng từ trang Cuộc hẹn đến trang Quản trị khách hàng, tìm Khách hàng đã nhớ và chỉ khi đó mới có thể duyệt thông tin của họ.

Lý tưởng giống như nội dung quản trị viên sẽ tuyệt vời. Tuy nhiên, tôi chỉ có thể tạo một CustomerInline trên trang quản trị Appointment nếu Customer có một số ForeignKey("Appointment"). (Django đặc biệt cho tôi một lỗi nói rằng Customer không có ForeignKey để Appointment). Có ai biết chức năng tương tự không, nhưng khi AppointmentForeignKey('Customer')?

Lưu ý: Tôi đã đơn giản hóa các mô hình; trường Khách hàng thực tế hiện có khoảng ~ 10 trường bên cạnh tên (một số văn bản miễn phí), vì vậy sẽ không thực tế khi đặt tất cả thông tin trong __unicode__.

Trả lời

4

Hoàn @ John answer từ trên cao - xác định những gì bạn muốn thấy trên danh sách thay đổi của bạn:

return '<a href="%s">%s</a>' % (
        reverse('admin:applabel_customer_change', (self.customer.id,)), 
        self.customer.name # add more stuff here 
      ) 

Và để thêm video này dưới hình thức thay đổi, xem: Add custom html between two model fields in Django admin's change_form

+3

Dường như tại một số điểm Django đã thêm ['ModelAdmin.list_display_links'] (https://docs.djangoproject.com/en/1.7/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display_links) để tóm tắt mã cho giải pháp của bạn. – MrColes

7

Không có cách nào dễ dàng để thực hiện việc này với django. Các nội tuyến được thiết kế để theo dõi các mối quan hệ ngược.

Khả năng thay thế tốt nhất sẽ là cung cấp liên kết đến đối tượng người dùng. Trong giao diện danh sách này là khá tầm thường:

Thêm một phương pháp để mô hình hẹn của bạn như:

def customer_admin_link(self): 
    return '<a href="%s">Customer</a>' % reverse('admin:app_label_customer_change %s') % self.id 
customer_admin_link.allow_tags = True 
customer_admin_link.short_description = 'Customer' 

Sau đó, trong ModelAdmin add bạn:

list_display = (..., 'customer_admin_link', ...) 

giải pháp khác để có được chính xác những gì bạn' đang tìm kiếm chi phí phức tạp hơn một chút là xác định mẫu quản trị viên tùy chỉnh. Nếu bạn làm điều đó bạn về cơ bản có thể làm bất cứ điều gì. Dưới đây là hướng dẫn tôi đã sử dụng trước đây để giải thích: http://www.unessa.net/en/hoyci/2006/12/custom-admin-templates/

Về cơ bản, sao chép biểu mẫu thay đổi từ nguồn django và thêm mã để hiển thị thông tin khách hàng.

+0

Cảm ơn !!cho thông tin có giá trị nhưng sau khi thực hiện tất cả những điều này, tôi nhận được lỗi ** Thuộc tínhError: đối tượng 'NoneType' không có thuộc tính 'id' ** Ngoài ra, liên kết được cung cấp không hoạt động: ( – stillfool

1

Trong lớp ModelAdmin cho các cuộc hẹn của bạn, bạn nên khai báo phương pháp sau:

class MySuperModelAdmin(admin.ModelAdmin): 
    def get_form(self, request, obj=None, **kwargs): 

    if obj: 
     # create your own model admin instance here, because you will have the Customer's 
     # id so you know which instance to fetch 
     # something like the following 
     inline_instance = MyModelAdminInline(self.model, self.admin_site) 
     self.inline_instances = [inline_instance] 

    return super(MySuperModelAdmin, self).get_form(request, obj, **kwargs) 

Để biết thêm thông tin, hãy duyệt nguồn Đó là chức năng để cung cấp cho bạn một ý tưởng về những gì bạn sẽ có quyền truy cập vào.

https://code.djangoproject.com/browser/django/trunk/django/contrib/admin/options.py#L423

+0

Điều gì MyModelAdminInline có được dựa trên không? Nó có mở rộng một trong các lớp nội tuyến hoặc lớp ModelAdmin không? (Tôi đã thử cả hai nhưng tiếp tục nhận được lỗi dọc theo các dòng của X không gọi được, không có thuộc tính '_meta', việc bổ sung __call sẽ giúp một chút nhưng tôi không biết những gì để tạo/trả lại.) Một ví dụ MyModelAdminInline sẽ khá hữu ích! – owenfi

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