【问题标题】:Django 2: how to force a foreignkey in admin interfaceDjango 2:如何在管理界面中强制使用外键
【发布时间】:2019-06-15 11:34:48
【问题描述】:

我是 Django 和 Python 的新手。假设我正在构建一个应用程序来管理公司用户使用的设备。我有多家公司,每个公司都有多个用户和房间。

房间和用户始终与公司相关联。

设备可以链接到:

  • 用户(“Joe 的 iPhone”、“Anna 的笔记本电脑”)
  • 一个房间(“会议室的电脑”)

设备始终与公司相关联。

所以,我可以拥有一个仅与公司关联的设备。

这是我的代码:

models.py:

class Company(models.Model):
    name=models.CharField(max_length=50)

class User(models.Model):
    name=models.CharField(max_length=50)
    company=models.ForeignKey('Company', on_delete=models.CASCADE)

class Room(models.Model):
    name=models.CharField(max_length=50)
    company=models.ForeignKey('Company', on_delete=models.CASCADE)

class Device(models.Model):
    company=models.ForeignKey('Company', on_delete=models.CASCADE)
    user=models.ForeignKey('User', on_delete=models.CASCADE,  blank=True, null=True)
     room=models.ForeignKey('Room', on_delete=models.CASCADE,  blank=True, null=True)

admin.py:

class DevicesInline(admin.TabularInline):
    model = Device
    extra = 0
    def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
        if db_field == "Company":
            kwargs['queryset'] = ## Here I don't know ##
        return super().formfield_for_foreignkey(db_field, request, **kwargs)

class UserAdmin(admin.ModelAdmin):
    inlines = [DeviceInline]

我想要的非常简单:当我编辑用户(或房间)时,我希望能够为其添加设备。但是Company字段必须填写用户或房间的公司,并且不能修改。就是这样:)

PS:如果设备已经链接到用户或房间,我不知道是否需要链接到公司?那完全是另一个问题。

【问题讨论】:

    标签: django


    【解决方案1】:

    在 Django 中,要标记必填字段,您必须将 kwarg blank blank=False 添加到字段中,并添加 null=False 以在数据库上强制执行关系。 在您的情况下,如果您想强制用户添加公司:

    class User(models.Model):
        name=models.CharField(max_length=50)
        company=models.ForeignKey('Company',blank=False,null=False, on_delete=models.CASCADE)
    
    class Room(models.Model):
        name=models.CharField(max_length=50)
        company=models.ForeignKey('Company',blank=False,null=False, on_delete=models.CASCADE)
    

    另外,Device模型中不需要添加Company作为ForeignKey,你的数据会不准确,假设设备链接到CompanyA,而设备房间链接到CompanyB...

    关于使公司成为只读字段,请查看answer

    class MyModelAdmin(admin.ModelAdmin):
    
        def get_readonly_fields(self, request, obj=None):
            if obj: # editing an existing object
                return self.readonly_fields + ('field1', 'field2')
            return self.readonly_fields
    

    【讨论】:

      【解决方案2】:

      这周我没有时间做这件事,但我坚持了下来。

      设备将与公司、用户或房间相关联。它必须与其中之一相关联。因此,如果设备与用户相关联,就像用户与公司相关联,则设备与用户所在的公司相关联。

      现在我只需要在模型内部做一些事情来说明一个设备必须有一个公司、一个用户或一个房间。我不知道我会怎么做。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-25
        • 1970-01-01
        • 1970-01-01
        • 2017-10-10
        • 1970-01-01
        • 1970-01-01
        • 2011-08-13
        • 1970-01-01
        相关资源
        最近更新 更多