Django 관리자 : 인라인으로서의 OneToOne 관계?
satchmo 응용 프로그램의 관리자를 모으고 있습니다. Satchmo는 OneToOne 관계를 사용하여 기본 Product
모델 을 확장하고 있으며 모든 것을 한 페이지에서 편집하고 싶습니다.
인라인으로 OneToOne 관계를 가질 수 있습니까? 그렇지 않은 경우 결국 OneToOne 관계에 저장 될 관리자의 특정 페이지에 몇 개의 필드를 추가하는 가장 좋은 방법은 무엇입니까?
예를 들면 :
class Product(models.Model):
name = models.CharField(max_length=100)
...
class MyProduct(models.Model):
product = models.OneToOne(Product)
...
내 관리자를 위해 이것을 시도했지만 작동하지 않고 외래 키를 예상하는 것 같습니다.
class ProductInline(admin.StackedInline):
model = Product
fields = ('name',)
class MyProductAdmin(admin.ModelAdmin):
inlines = (AlbumProductInline,)
admin.site.register(MyProduct, MyProductAdmin)
이 오류가 발생합니다. <class 'satchmo.product.models.Product'> has no ForeignKey to <class 'my_app.models.MyProduct'>
이 작업을 수행하는 유일한 방법은 사용자 지정 양식 입니까?
편집 : 필드를 직접 추가하기 위해 다음 코드를 시도했습니다 ...도 작동하지 않습니다.
class AlbumAdmin(admin.ModelAdmin):
fields = ('product__name',)
OneToOne 관계에 인라인을 사용하는 것은 완벽하게 가능합니다. 그러나 관계를 정의하는 실제 필드는 ForeignKey와 동일한 방식으로 부모 모델이 아닌 인라인 모델에 있어야합니다. 전환하면 작동합니다.
댓글 후 수정 : 상위 모델이 이미 관리자에게 등록되었다고 말한 다음 등록을 취소하고 다시 등록합니다.
from original.satchmo.admin import ProductAdmin
class MyProductInline(admin.StackedInline):
model = MyProduct
class ExtendedProductAdmin(ProductAdmin):
inlines = ProductAdmin.inlines + (MyProductInline,)
admin.site.unregister(Product)
admin.site.register(Product, ExtendedProductAdmin)
마지막 질문을 참조하면 여러 하위 유형에 가장 적합한 솔루션은 무엇입니까? 예 : 하위 유형 클래스 Book 및 하위 유형 클래스 CD가있는 클래스 제품. 여기에 표시된 방법은 일반 항목과 책의 하위 유형 항목 및 CD의 하위 유형 항목을 추가하여 제품을 편집해야합니다. 따라서 책만 추가하려는 경우에도 CD 필드가 표시됩니다. DVD와 같은 하위 유형을 추가하면 세 개의 하위 유형 필드 그룹이 생기지 만 실제로는 하나의 하위 유형 그룹 만 필요합니다.
OneToOne 관계 대신 상속을 사용할 수 있습니다.
class Product(models.Model):
name = models.CharField(max_length=100)
...
class MyProduct(Product):
.....
또는 프록시 클래스 사용
class ProductProxy(Product)
class Meta:
proxy = True
admin.py에서
class MyProductInlines(admin.StackedInline):
model = MyProduct
class MyProductAdmin(admin.ModelAdmin):
inlines = [MyProductInlines]
def queryset(self, request):
qs = super(MyProductAdmin, self).queryset(request)
qs = qs.exclude(relatedNameForYourProduct__isnone=True)
return qs
admin.site.register(ProductProxy, MyProductAdmin)
이 변형에서는 제품이 인라인됩니다.
OneToOneField에서 'parent_link = True'를 설정할 수도 있습니다.
https://docs.djangoproject.com/en/dev/topics/db/models/#specifying-the-parent-link-field
참고URL : https://stackoverflow.com/questions/1744203/django-admin-onetoone-relation-as-an-inline
'program story' 카테고리의 다른 글
부트 스트랩 3-열 내부 사용자 지정 div의 100 % 높이 (0) | 2020.12.05 |
---|---|
Visual Studio에서 빈 텍스트 복사 비활성화 (0) | 2020.12.05 |
야생에서 좋은 오이 예? (0) | 2020.12.05 |
Java Generics WildCard : (0) | 2020.12.05 |
데스크탑 경로에 대한 환경 변수는 무엇입니까? (0) | 2020.12.04 |