我正在尝试在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')
我发现了一些古老的讨论,但是没有一个提议的解决方案起作用。
答案 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)