Django - отображение модели с типом контента в админ-панели - PullRequest
0 голосов
/ 25 ноября 2018

Я новичок в Django и столкнулся с проблемой.У меня есть несколько моделей, которые требуют адрес и номер телефона против адреса.И с некоторыми моделями может быть связан только номер телефона.Итак, я сделал полиморфное отношение для " Адреса " и " PhoneNumber ".Как здесь:

class PhoneNumber(SoftDeleteModel):
     phone_number = PhoneNumberField()
     content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
     object_id = models.PositiveIntegerField()
     content_object = GenericForeignKey('content_type', 'object_id')
     created_at = models.DateTimeField(auto_now=False, auto_now_add=True)
     updated_at = models.DateTimeField(auto_now=True, auto_now_add=False)
     created_by = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)

     def __str__(self):
         return self.phone_number.as_e164

class Address(SoftDeleteModel):
     house_number = models.CharField(max_length=255)
     street_number = models.CharField(max_length=255)
     area = models.CharField(max_length=255)
     city = models.CharField(max_length=255)
     country = models.CharField(max_length=255)
     content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
     object_id = models.PositiveIntegerField()
     phone_number = GenericRelation(PhoneNumber)
     content_object = GenericForeignKey('content_type', 'object_id')
     created_at = models.DateTimeField(auto_now=False, auto_now_add=True)
     updated_at = models.DateTimeField(auto_now=True, auto_now_add=False)
     created_by = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)

     def __str__(self):
          return str(self.house_number)+", "+str(self.street_number)+", "+self.area+", "+self.city+", "+self.country

Это модель для Адрес & PhoneNumber Я использую Адрес Модель в Продавец например:

class Vendor(SoftDeleteModel):
     vendor_name = models.CharField(max_length=500)
     vendor_phone = GenericRelation(PhoneNumber)
     vendor_address_detailed = GenericRelation(Address)
     vendor_contact_person = models.CharField(max_length=500)
     created_at = models.DateTimeField(auto_now=False, auto_now_add=True)
     updated_at = models.DateTimeField(auto_now=True, auto_now_add=False)
     created_by = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)

     def __str__(self):
          return self.vendor_name

Когда я делаю Crud в админ для продавца, я могу получить только Адреса не PhoneNumber в Адрес модель, как в на этой картинке enter image description here

И код для классов администратора ниже:

class PhoneNumberAdmin(GenericTabularInline):
     model = PhoneNumber
     extra = 1
     exclude = ('deleted', 'created_by')

     def save_model(self, request, obj, form, change):
         obj.created_by = request.user
         super().save_model(request, obj, form, change)


class AddressAdmin(GenericStackedInline):
     model = Address
     extra = 1
     exclude = ('deleted', 'created_by')

     def save_model(self, request, obj, form, change):
         obj.created_by = request.user
         super().save_model(request, obj, form, change)


class VendorAdmin(admin.ModelAdmin):
     model = Vendor
     list_display = ('vendor_name', 'created_by', 'created_at_readable')
     inlines = (AddressAdmin, )
     exclude = ('deleted', 'created_by')

     def created_at_readable(self, obj):
         return naturaltime(obj.created_at)

     created_at_readable.empty_value_display = "???"

Пожалуйста, помогите мне добавить PhoneNumber используя Django Admin.

Редактировать:

Я хочу связать номера телефонов с каждым адресом.Поэтому в админке поле PhoneNumber будет в модели Adress, а не в Vendor.Спасибо

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

После серфинга в интернете я обнаружил эту библиотеку NestedAdmin.Эта библиотека поддерживает почти все виды вложенных отношений в админке.Я собираюсь опубликовать его URL здесь.

https://github.com/theatlantic/django-nested-admin

Спасибо за ваше время, хотя.

0 голосов
/ 25 ноября 2018

Добавить встроенный номер телефона в VendorAdmin

 inlines = (AddressAdmin, PhoneNumberAdmin)
...