Модель Джанго договора аренды с использованием общего внешнего ключа - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь смоделировать договор аренды в Джанго и использовать форму администратора, чтобы вставить и изменить его. И владельцем, и арендатором могут быть компании (номер НДС) или физические лица (без номера НДС). Компании и частные лица хранятся в двух разных моделях (Компания и Физическое лицо).

Я пытаюсь решить эту проблему с помощью общего внешнего ключа, но не могу показать имя арендатора на странице администратора, только целочисленное поле, вообще не дружественное.

gestimm - название приложения, и это мои упрощенные модели:

# my gestimm/models.py
#
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.db import models


class Individual(models.Model):
    name = models.CharField(max_length=100, help_text='Name')

    def __str__(self):
        return self.name


class Company(models.Model):
    name = models.CharField(max_length=100, help_text='Name')

    def __str__(self):
        return self.name


class Contract(models.Model):
    description = models.CharField(max_length=30)
    start = models.DateField()
    stop = models.DateField()

    def __str__(self):
        return self.description


class Tenant(models.Model):
    limit = models.Q(app_label='gestimm', model='individual') | models.Q(app_label='gestimm', model='company')
    contract = models.ForeignKey(Contract, on_delete=models.CASCADE,
                                 null=True, blank=True)
    content_type = models.ForeignKey(ContentType, on_delete=models.PROTECT,
                                     help_text='Tenant', null=True,
                                     limit_choices_to=limit)
    object_id = models.PositiveIntegerField(null=True)
    tenant = GenericForeignKey('content_type', 'object_id')

Как я пытался решить проблему:

# my gestimm/admin.py
#
from django.contrib import admin

from .models import Individual, Company, Contract, Tenant


class TenantInline(admin.StackedInline):
    model = Tenant
    extra = 1


class ContractAdmin(admin.ModelAdmin):
    inlines = [TenantInline]


admin.site.register(Individual)
admin.site.register(Company)
admin.site.register(Contract, ContractAdmin)

Я нашел несколько старых обсуждений, но ни одно из предложенных решений не сработало.

1 Ответ

0 голосов
/ 22 января 2019

Проблема решена: я установил Джанго-Грапелли .

Мой новый admin.py:

class TenantInline(admin.TabularInline):
    model = Tenant
    extra = 1
    related_lookup_fields = {
        'generic': [['content_type', 'object_id']],
    }


class ContractAdmin(admin.ModelAdmin):
    inlines = [
        TenantInline,
    ]


admin.site.register(Contract, ContractAdmin)

По назначению

...