Django-管理网站中OneToOne字段的内联表单
问题内容:
嗨,这个问题已经被问过很多次了,但是不幸的是我找不到真正可行的答案。以下是我的模型:
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一起使用,而且我不够聪明,无法使其与1.6一起使用
- 关于使用代理模型和抽象基类的堆栈覆盖流程中的一些建议,这些建议也不起作用。
如果有人可以帮助我找到解决方法,我将不胜感激。
问题答案:
我没有尝试过,但是这个要点似乎是基于django-reverse-admin中的代码,但是已更新为可以在Django 1.6上运行:
https://gist.github.com/mzbyszewska/8b6afc312b024832aa85
请注意,示例代码的这一部分是错误的:
class AddressForm(models.Form):
pass
…您需要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'
即,如果您不需要内联模型的自定义表单。