使用通用外键的Django租金合同模型

时间:2019-01-21 21:47:58

标签: django django-models django-admin

我正在尝试在Django中建模一个租金合同,并使用管理表单来插入和修改它。 所有者和承租人都可以是公司(增值税号)或个人(没有增值税号)。公司和个人存储在两个不同的模型中(公司和个人)。

我正在尝试使用通用外键来解决此问题,但是我无法在管理页面中显示租户名称,只能显示一个完全不友好的整数字段。

gestimm是应用程序的名称,这是我过于简化的模型:

public void OpenFile(Stream fileStream)
    {
        if (fileStream == null || fileStream.Length == 0)
        {
            throw new Exception("File download error");
        }

        using (fileStream)
        {
            var documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
            var filename = Path.Combine(documents, "Report " + DateTime.UtcNow.ToShortDateString() + ".xls");

            File.WriteAllBytes(filename, fileStream.ReadAsBytes());

            var viewer = UIDocumentInteractionController.FromUrl(NSUrl.FromFilename(filename));
            var controller = GetVisibleViewController();
            viewer.PresentOpenInMenu(controller.View.Frame, controller.View, true);
        }
    }
    private static UIViewController GetVisibleViewController(UIViewController controller = null)
    {
        controller = controller ?? UIApplication.SharedApplication.KeyWindow.RootViewController;

        if (controller.PresentedViewController == null)
            return controller;

        if (controller.PresentedViewController is UINavigationController uinav)
        {
            return uinav.VisibleViewController;
        }

        if (controller.PresentedViewController is UITabBarController uitab)
        {
            return uitab.SelectedViewController;
        }

        return GetVisibleViewController(controller.PresentedViewController);
    }

我如何解决该问题:

# 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')

我发现了一些古老的讨论,但是没有一个提议的解决方案起作用。

1 个答案:

答案 0 :(得分:0)

问题已解决:我安装了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