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-реверс-админ. К сожалению, не работал с Django 1.6, и я недостаточно saavy, чтобы заставить его работать с 1.6
- несколько suggection в поток stackover при использовании прокси-моделей и абстрактного базового класса также не работал.
Я был бы очень признателен, если бы кто-то мог помочь мне найти обходной путь для этого.
2 ответов
Я не пробовал, но эта суть, похоже, основана на коде в 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'
т. е. если вам не нужна пользовательская форма для встроенной модели.
Я установил:
- Django==1.6.5
- MySQL-python==1.2.4
- Юг==0.8.1
и код ниже работает от меня:
models.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)
admin.py
# -*- 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)
и это администратор inferface: