首页 > 解决方案 > Django 自定义下拉菜单取决于字段类型

问题描述

我有模型:

class DeepLink(models.Model):

    class DeepLinkType(models.TextChoices):
                TRACING = ('Tracing', 'Tracing')
                BUTTON = ('Button', 'Button')
                MODAL = ('Modal', 'Modal')
    
    id = models.UUIDField(primary_key=True, default=uuid4)
    type = models.CharField(max_length=7, choices=DeepLinkType.choices, blank=False)
    uri = models.UUIDField(blank=False, default=uuid4)
    
    
    class Meta:
        db_table = 'deeplink'

class Button(models.Model):

    id = models.UUIDField(primary_key=True, default=uuid4)
    text = models.CharField(max_length=500, blank=False)
    link = models.CharField(max_length=250, blank=False)
    image = models.CharField(max_length=250, blank=True)

    class Meta:
        db_table = 'button'


class Modal(models.Model):

    id = models.UUIDField(primary_key=True, default=uuid4)
    image = models.CharField(max_length=250, blank=True)
    header = models.CharField(max_length=250, blank=True)
    body = models.CharField(max_length=250, blank=True)

    class Meta:
        db_table = 'modal'

class Tracing(models.Model):

    id = models.UUIDField(primary_key=True, default=uuid4)
    external = models.BooleanField(blank=True, default=False)
    external_link = models.CharField(max_length=250, blank=True)

    class Meta:
        db_table = 'tracing'

根据选择,我需要uri在 Django Admin 中的字段下拉列表type。例如,如果我们选择typeas Button,则该uri字段应该是所有可能按钮等的下拉列表。

显然我不能声明uri为外键,因为它可以引用 3 个表。因此,它现在只是管理员中的一个文本字段。

如何在 Django Admin 中进行这样的动态下拉菜单?

标签: pythondjangodjango-models

解决方案


这看起来是通用外键的完美用途。一般来说,建议谨慎使用它们,但这是它们的用途。

https://simpleisbetterthancomplex.com/tutorial/2016/10/13/how-to-use-generic-relations.html


推荐阅读