2011-04-15 92 views
3

我在Django的管理員中通過TabularInline列出模型。在這個內聯中,我想使用Django的模型遍歷語法通過外鍵列出模型中引用的其他模型中的數據。例如清單Django中的相關字段ModelAdmin

class MyRelatedModel(models.Model) 
    name = models.CharField(max_length=50) 
    created = models.DateField(auto_now_add=True) 
    other = models.ForeignKey('MyOtherRelatedModel') 

class MyOtherRelatedModel(models.Model) 
    name = models.CharField(max_length=50) 
    created = models.DateField(auto_now_add=True) 

class MyRelatedModelInline(admin.TabularInline): 
    model = MyRelatedModel 
    fields = ['name', 'created', 'other__name'] 
    #readonly_fields = ['name', 'created', 'other__name'] 

然而, 'other__name' 的使用拋出ImproperlyConfigured錯誤:

'MyRelatedModelInline.fields' refers to field 'other__name' that is missing from the form 

是在的ModelAdmin情況下不支持的模型遍歷語法?如果支持,我在做什麼錯了?

編輯:如果我去掉readonly_fields,誤差變爲:

Caught AttributeError while rendering: 'MyMainModelAdmin' object has no attribute '__name__' 
+3

[在Django管理改變顯示ForeignKey的數據/添加頁]的可能重複(http://stackoverflow.com/questions/5665133/displaying-foreignkey-data-in-django-admin-change-添加頁面) – 2011-04-15 15:49:45

回答

10

按照上述羅斯曼的建議,可以顯示相關的(一到一個或多個對一)在只讀方式數據內聯管理員模型。這裏有一個小例子,只是爲了確保我們都在同一頁面上。你可以在下面看到,有三種方法可以實現你的目標(如果我正確理解了這個目標)。

models.py:

class Company(models.Model): 
    name = models.CharField(max_length=50) 

class Employee(models.Model): 
    name = models.CharField(max_length=50) 
    company = models.ForeignKey('Company') 
    car = models.ForeignKey('Car') 

    def model_callable(self): 
     return self.car.rego 

class Car(models.Model): 
    rego = models.CharField(max_length=50) 

admin.py:

def unbound_callable(emp): 
    return emp.car.rego 

class EmployeeInline(admin.TabularInline): 
    model = Employee 
    fields = ('name', 'model_callable', 'model_admin_callable', unbound_callable) 
    readonly_fields = ('model_callable', 'model_admin_callable', unbound_callable) 

    def model_admin_callable(self, emp): 
     return emp.car.rego 

class CompanyAdmin(admin.ModelAdmin): 
    model = Company 
    inlines = (EmployeeInline,) 

admin.site.register(Company, CompanyAdmin) 

正如你可以看到, 'readonly_fields' 被以相同的方式爲 'list_display' 作爲每Django文檔處理爲contrib.admin(從1.2開始)。

在上例中,當您在編輯公司時,您會看到其員工內聯。每行在可編輯文本框中都會有一個員工姓名,並且在該姓名旁邊,您將看到員工車輛rego的只讀文本(emp.car.rego)。

參照你原來的問題,你想引用相關的數據爲'other__name'。這不起作用。諸如other__namecar__rego之類的表達式在運行Django查詢時僅在過濾器中具有特殊含義。例如,在提取具有特定rego編號的車輛的員工時:

Employee.objects.filter(car__rego='111') 

希望有所幫助。

Ĵ