[英]Django - Inline form for OneToOne field in admin site
嗨 这个问题已经被问过很多次了,但不幸的是我找不到一个真正有效的答案。 以下是我的模型:
class Person(models.Model):
name = models.CharField(max_length=100)
...
class Address(models.Model):
person = models.OneToOneField(Person)
...
然后在管理员中我有:
class AddressInline(admin.StackedInline):
model = Address
class PersonAdmin(admin.ModelAdmin):
inlines = (AddressInline)
admin.site.register(Person, PersonAdmin)
然后我得到了这个臭名昭著的错误:
<class 'address.models.Address'> has no ForeignKey to <class 'person.models.Person'>
我试过了:
如果有人能帮我找到解决方法,我将不胜感激。
我还没有尝试过,但这个要点似乎基于 django-reverse-admin 中的代码,但已更新为适用于 Django 1.6:
https://gist.github.com/mzbyszewska/8b6afc312b024832aa85
请注意,示例代码的这一部分是错误的:
class AddressForm(models.Form):
pass
...您需要from django import forms
顶部的from django import forms
,然后执行以下操作:
class AddressForm(forms.ModelForm):
class Meta:
model = Address
此处第 46 行的示例代码中还有另一个问题:
inline_reverse = ('business_addr', ('home_addr', AddressForm), ('other_addr' (
'form': OtherForm
'exclude': ()
)))
应该是:
inline_reverse = ('business_addr', ('home_addr', AddressForm), ('other_addr', {
'form': OtherForm,
'exclude': ()
}))
请注意,它向您展示了指定内联的三种不同方式...第一种只是通过字段名称'business_addr'
即如果您不需要内联模型的自定义表单。
我已经安装:
下面的代码适用于我:
模型.py
# -*- coding: utf-8 -*-
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=100)
class Address(models.Model):
person = models.OneToOneField(Person)
street = models.CharField(max_length=100)
管理文件
# -*- coding: utf-8 -*-
from django.contrib import admin
from .models import *
class AddressInline(admin.StackedInline):
model = Address
class PersonAdmin(admin.ModelAdmin):
inlines = (AddressInline,)
admin.site.register(Person, PersonAdmin)
admin.site.register(Address)
这是管理界面:
对于那些寻找 Django 2.0 解决方案的人:你可以使用这个库: https : //pypi.org/project/django-reverse-admin/
它对我来说效果很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.