【问题标题】:Edit attributes of a child model from the form representing parent model从代表父模型的表单编辑子模型的属性
【发布时间】:2013-07-29 05:37:22
【问题描述】:

我有一个具有不同属性的人物模型。一个人有一个地址,它是个人/父模型的 OneToOneField。当我在添加/编辑人员时使用管理表单时,我还需要编辑地址属性,如 line1、line2、mobile 等。同样,我想从管理页面中删除一些人,它也应该删除匹配的引用,如地址。我已经尝试了很多东西,包括 Inline 等等。但是,我认为只有当地址与人有外键时,内联才能起作用,反向是不可能的。对此的任何帮助将不胜感激......

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)

【问题讨论】:

  • 请展示您的模型以及您尝试过的内容。
  • 类 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=没错,db_column='BUSINESS_ADDRESS_ID').... 类元:db_table = 'PD_PERSON'
  • class Address(models.Model): 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) # 字段名小写。类元: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)
  • 嘿@naw,欢迎来到 Stack Overflow :) - 另一次将代码放入问题本身(您可以编辑您的问题)。这次我为你做了,让人们更容易阅读。

标签: python django python-3.x django-admin


【解决方案1】:

问题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()

但这不会在“您确定吗?”中显示地址留言..


问题2:在个人管理页面编辑地址

目前,我没有看到比构建自定义表单来编辑 Person 模型更简单的解决方案,并覆盖 add_view() 和 change_view() 方法以使用 O2O 键初始化此表单..

【讨论】:

  • 我想知道 ModelInline 在这种情况下是否会有所帮助。如果是,我在哪里做错了。如果没有,是否有破解?我认为仅当外键位于子模型中或 django admin 的编辑/添加仅适用于父模型而不适用于关联的子模型时,内联才支持..
猜你喜欢
  • 2021-01-18
  • 1970-01-01
  • 2010-12-29
  • 2016-05-06
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-11
相关资源
最近更新 更多