2011-12-22 29 views
8

Nói rằng tôi có một số mô hình django, một cái gì đó như thế này:inlines Xếp trong Django quản trị với nhiều hơn một mô hình

class Address(models.Model): 
    pass 

class Person(models.Model): 
    address = models.ForeignKey(Address) 

class Store(models.Model): 
    address = models.ForeignKey(Address) 

class Company(models.Model): 
    address = models.ForeignKey(Address) 

Vì vậy, trong giao diện quản lý, tôi muốn để có thể chỉnh sửa một Person và có địa chỉ xếp hàng.

Tôi biết nó có thể làm điều này,

class Address(models.Model): 
    person = models.ForeignKey(Person, blank=True) 
    store = models.ForeignKey(Store, blank=True) 
    company = models.ForeignKey(Company, blank=True) 

class Person(models.Model): 
    pass 

class Store(models.Model): 
    pass 

class Company(models.Model): 
    pass 

Sau đó, tôi có thể làm như thường lệ,

class AddressInline(admin.TabularInline): 
    model = Address 

class PersonAdmin(admin.ModelAdmin): 
    model = Person 
    inlines = (AddressInLine,) 

class CompanyAdmin(admin.ModelAdmin): 
    and so on 

Nhưng điều này thì có nghĩa là tôi muốn có nhiều hơn một địa chỉ mỗi người, và Mô hình địa chỉ của tôi không cảm thấy đúng nữa.

Mọi trợ giúp sẽ được đánh giá cao.

Trả lời

4

Hãy thử như sau

from django.db import models 
from django.contrib.contenttypes.models import ContentType 
from django.contrib.contenttypes import generic 

class Address(models.Model): 
    object_id = models.PositiveIntegerField() 
    content_type = models.ForeignKey(ContentType) 
    of   = generic.GenericForeignKey('content_type', 'object_id') 

class Person(models.Model): 
    pass 

class Store(models.Model): 
    pass 

class Company(models.Model): 
    pass 

Sau đó, bạn có thể làm điều này:

from django.contrib import admin 
from django.contrib.contenttypes import generic 

class AddressInline(generic.GenericStackedInline): 
    model = Address 
    max_num = 1 

class PersonAdmin(admin.ModelAdmin): 
    model = Person 
    inlines = (AddressInLine,) 

class CompanyAdmin(admin.ModelAdmin): 
    and so on 

admin.site.register(Person, PersonAdmin) 
+1

Điều đó sẽ làm việc cho tôi :) Cảm ơn –

+1

Vậy làm cách nào để bạn liên kết mô hình Người với Địa chỉ? Nó vẫn là một ForeignKey bình thường? – Greg

2

Thay đổi lớp AddressInline (admin.TabularInline) thành lớp AddressInline (admin.StackedInline) sẽ làm cho Địa chỉ nội tuyến trông ít giống như có thể có nhiều.

Đặt AddressInline.max_num thành 1 nếu bạn muốn không quá 1 địa chỉ cho mỗi AddressInline.

Đặt AddressInline.extra thành 1 nếu bạn muốn biểu mẫu địa chỉ trống khi không có Địa chỉ liên quan.

Tài liệu: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#inlinemodeladmin-options

+0

Vâng, đó là giới hạn số lượng địa chỉ để chỉ một :). –

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