【问题标题】:Django model of a rent contract using Generic Foreign Key使用通用外键的租赁合同的 Django 模型
【发布时间】:2019-01-21 21:47:57
【问题描述】:

我正在尝试在 Django 中为租赁合同建模并使用管理表单来插入和修改它。 业主和租户都可以是公司(增值税号)或个人(无增值税号)。公司和个人存储在两种不同的模型中(公司和个人)。

我正在尝试使用通用外键解决这个问题,但我无法在管理页面中显示租户名称,只有一个整数字段根本不友好。

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)

我发现了一些旧的讨论,但没有一个提议的解决方案奏效。

【问题讨论】:

    标签: django django-models django-admin


    【解决方案1】:

    问题已解决:我安装了django-grappelli

    我的新 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)
    

    As intended

    【讨论】:

      猜你喜欢
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      • 2017-06-01
      • 1970-01-01
      • 2018-07-25
      • 2010-10-29
      • 2011-12-03
      • 2016-10-24
      相关资源
      最近更新 更多