0

さまざまな属性を持つ人物モデルがあります。Person には、Person/parent モデルの OneToOneField である Address があります。個人の追加/編集で管理フォームに移動すると、line1、line2、mobile などのアドレス属性も編集する必要があります。同様に、管理ページから誰かを削除したいのですが、住所などの一致する参照も削除する必要があります。インラインなど、すでに多くのことを試しました。しかし、アドレスがその人と外部キーを持っている場合にのみインラインが機能したと思いますが、逆は不可能でした。これに関するあらゆる種類の助けをいただければ幸いです...

class Person(models.Model):
    person_Id = models.CharField(max_length=32L, primary_key=True, db_column='PERSON_ID', editable=False)
    business_Address = models.OneToOneField(Address, unique=True, db_column='BUSINESS_ADDRESS_ID')

    class Meta:
        db_table = 'PD_PERSON' 

class Address(models.Model):
    # Field names made lowercase.
    address_id = models.IntegerField(primary_key=True, db_column='ADDRESS_ID')
    address_name = models.CharField(max_length=256L, db_column='NAME', blank=True)
    line1 = models.CharField(max_length=128L, db_column='LINE1', blank=True)
     class Meta:
        db_table = 'PD_ADDRESS' 

admin.py で ~

class PersonInline(admin.TabularInline):
    model = Person

class PersonAdmin(admin.ModelAdmin):
    list_display = ('customer_Id', 'complete_Name', 'company')
    search_fields = ('name', 'customer_Id', 'email_Id')

class AddressAdmin(admin.ModelAdmin):
    inlines = [ PersonInline, ]

admin.site.register(Address, AddressAdmin)
#admin.site.register(Category)
#admin.site.register(Languages)
admin.site.register(Person, PersonAdmin)
4

1 に答える 1

0

問題 1:個人の削除時にアドレスを削除する

人が削除されたら、post_delete シグナルを使用してアドレスを自動的に削除できます。使い方はとても簡単です

from django.db.models.signals import post_delete
from web.programing.roxx.models import Person, Adress

@receiver(post_delete, sender=Person, dispatch_uid="person_post_delete")
def onPersonDelete(sender, instance, using, **kwargs):
    # be carefull, the instance doesn't exist anymore in the database
    adress_id = instance.business_Address.id
    if id != None:
        Adress.objects.filter(id=adress_id).delete()

しかし、これは「Are you sure ?」にアドレスを表示しません。メッセージ..


問題 2:個人管理ページで住所を編集する

現時点では、カスタム フォームを作成して Person モデルを編集し、add_view() メソッドと change_view() メソッドの両方をオーバーライドして、このフォームを O2O キーで初期化するよりも簡単な解決策はないと思います。

于 2013-07-29T16:40:37.460 に答える