Django OneToOneField 和管理 UI

标签 django django-admin

我对如何在 Django 中建立关系模型以便可以在 Django 管理中内联编辑感到困惑。

让我解释一下场景。

我有一个客户模型和一个地址模型。在客户模型中,我与地址有一个 OneToOneField 关系,一次用于计费,一次用于送货地址。

class Address(models.Model):
    pass

class Employee(models.Model):
    billing_address = models.OneToOneField(Address)
    shipping_address = models.OneToOneField(Address)
    # Many more such fields

现在有了这个模型,没有简单的方法让它们在管理中内联。我尝试了以下方法

class AddressInline(admin.TabularInline):
    model = Address

class Customer(admin.ModelAdmin):
    inlines = [AddressInline, ]

我一直收到错误,

<class 'employee.admin.AddressInline'>: (admin.E202) 'employee.Address' has no ForeignKey to 'employee.Customer'.

现在我知道还有其他类似的错误。 IE。 Use OneToOneField inlined in Django AdminDjango admin - OneToOneField inline throws "has no ForeignKey" exception

但我认为我的问题与这篇文章略有不同。请帮忙!

最佳答案

#1

模型.py

class BillingAddress(models.Model):
    employee = models.OneToOneField(to=Employee, related_name='billing_address')

class Employee(models.Model):
    # Many more such fields

admin.py

class AddressInline(admin.TabularInline):
    model = BillingAddress
    extra = 1

@admin.register(Employee)
class EmployeeAdmin(admin.ModelAdmin):
    inlines = [AddressInline, ]

#2

模型.py

class Address(models.Model):
    name = models.CharField(max_length=250)
    employee = models.ForeignKey(to=Employee, related_name='addresses')

class Employee(models.Model):
    # Many more such fields

admin.py

class AddressInline(admin.TabularInline):
    model = Address

@admin.register(Employee)
class EmployeeAdmin(admin.ModelAdmin):
    inlines = [AddressInline, ]

完整示例:

模型.py

class Company(models.Model):
    pass


class CompanyScheduler(models.Model):
    company = models.OneToOneField(
        to=Company,
        related_name='scheduling',
        on_delete=models.CASCADE,
    )

    start = models.DateField()
    finish = models.DateField()

管理员.py

class CompanySchedulerInLine(admin.TabularInline):
    model = CompanySchedulerInLine
    extra = 1


@admin.register(CompanyModelAdmin)
class CompanyModelAdmin(admin.ModelAdmin):

    inlines = [
        SchedulerInLine,
    ]

界面

enter image description here

关于Django OneToOneField 和管理 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27291728/

相关文章:

python - 在 django 模板中显示包含 html 标签的字段,如普通 html 标签

javascript - Google+ 登录 - 未捕获的安全错误

Django 管理员 : override delete method

python - 在 Django 中保存文件之前更改文件名

python - 日期的默认格式

django - SelectMultiple 小部件中的默认选定选项

django - 在Python中为函数的查询列表添加条件

python - 如何在 django 管理站点中使用 django-select2 小部件?

1000 名用户的 Django 管理员下拉菜单

django - 如何在 Django Admin 的 list_display 属性中定位内联?