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'即,如果您不需要内联模型的自定义表单。