为 Django 应用程序中的所有模型选择字段

Posted

技术标签:

【中文标题】为 Django 应用程序中的所有模型选择字段【英文标题】:Select field for all models within a Django app 【发布时间】:2015-05-29 05:49:21 【问题描述】:

我对 Django 很陌生。

我想为一些用户信息创建一个表单。根据用户信息的类型,字段应该改变...例如,用户的私人地址需要字段名称、街道、邮编和城市。但是如果他想把东西送到公司,可能会有更多的领域,比如部门或公司名称。

我想实现这样的东西,并在单独的应用程序中为每种输入创建一个额外的模型紧凑。

有没有办法在这个应用程序中获取一个包含所有可用模型列表的选择字段。


编辑

由于我还有一些问题,我在这里添加一个示例

文件:experiment/models.py

from django.db import models
from django.apps import apps
class BasicExperiment(models.Model):
    date_created = models.DateTimeField(editable=False)
    date_modified = models.DateTimeField(blank=True)
    label_app = apps.get_app('labels')
    label_types = apps.get_models(label_app)

文件:labels/models.py

from django.db import models
class SILAC(models.Model):
    lys0 = models.BooleanField('Lys-0', default=True)
    lys4 = models.BooleanField('Lys-4', default=None)
    lys8 = models.BooleanField('Lys-8', default=None)
    arg0 = models.BooleanField('Arg-0', default=True)
    arg6 = models.BooleanField('Arg-6', default=None)
    arg10 = models.BooleanField('Arg-10', default=None)
    class Meta:
        verbose_name = 'SILAC Labeling'

在 shell 中它按预期工作:

>>> from django.apps import apps
>>> app = apps.get_app('labels')
>>> for model in apps.get_models(app):
...     model._meta.verbose_name
... 
'SILAC Labeling'

在我的 models.py 中出现以下错误:

...
  File "/Users/madejung/Documents/django_dev/cfproteomics/experiments/models.py", line 5, in <module>
    class BasicExperiment(models.Model):
  File "/Users/madejung/Documents/django_dev/cfproteomics/experiments/models.py", line 10, in BasicExperiment
    label_app = apps.get_app('labels')
  File "/Library/Python/2.7/site-packages/django/apps/registry.py", line 370, in get_app
    "App '%s' doesn't have a models module." % app_label)
django.core.exceptions.ImproperlyConfigured: App 'labels' doesn't have a models module.

【问题讨论】:

你的意思是获取模型定义的所有字段吗? 不,不是。我知道如何从 ModelA 或 ModelB 中获取所有字段...我需要的是一种下拉菜单来选择我的应用程序中的任何模型 Model(ABCDE...)... 看看这些问题:***.com/questions/1125107/…***.com/questions/8702772/… 【参考方案1】:

你可以试试这个:

from django.db.models import get_app, get_models

app = get_app('my_application_name')
for model in get_models(app):
    # do something with the model

这里有更多信息Django get list of models in application

【讨论】:

我现在正在测试你的代码,它在 shell 中工作正常......但是如果我从另一个应用程序将它复制粘贴到我的模型中,我会收到一条错误消息 django.core.exceptions.ImproperlyConfigured: App 'labels' doesn't have a models module. 所以我不能在我的模块中使用get_app,或者我必须设置一个相对路径? mm 你能在这里写下你的项目结构和应用标签吗? 我可能刚刚发现contenttypes 是我正在寻找的东西......因为我想要一个下拉菜单,我将创建哪个模型......

以上是关于为 Django 应用程序中的所有模型选择字段的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 django 过滤器为给定模型中的所有字段创建一般搜索

Django 模型 - 在选择字段中更改选项并迁移

在 Django 中,根据模型中其他字段中选择的值删除选择字段下拉列表中的选项

Django:如何在手动表单字段中显示模型的外键对象作为选择

Django 动态模型字段

Django 查询返回空白值