Django模型设计:单个模型字段的可编辑帮助文本。是否存在引用模型特定字段的外部字段?

时间:2013-04-19 21:40:35

标签: django django-models model

我的应用中有几个带有多个字段的模型。我想为用户设置一种方法,以便能够为模型中的每个字段修改帮助文本系统。您能否就如何设计模型以及使用哪些字段类型给出一些指导?我觉得将模型和字段名称存储在CharFields中是不对的,但如果这是唯一的方法,我可能会坚持使用它。

使用Django有更优雅的解决方案吗?

对于一个快速而愚蠢的例子,使用名为jobs的应用程序,一个名为fun的应用程序,并创建一个名为helptext的新应用程序:

jobs.models.py:

class Person(models.Model):
    first_name = models.CharField(max_length=32)
    .
    .
    interests = models.TextField()
    def __unicode__(self):
        return self.name

class Job(models.Model):
    name = models.CharField(max_length=128)
    person = models.ForeignKey(Person)
    address = models.TextField()
    duties = models.TextField()
    def __unicode__(self):
        return self.name



fun.models.py:

class RollerCoaster(models.Model):
    name = models.CharField(max_length=128)
    scare_factor = models.PositiveInteger()
    def __unicode__(self):
        return self.name

class BigDipper(RollerCoaster):
    max_elevation = models.PositiveInteger()
    best_comment_ever_made = models.CharField(max_length=255)
    def __unicode__(self):
        return super.name

现在,假设我想在Person.interestsJob.dutiesRollerCoaster.scare_factorBigDipper.best_comment_ever_made上提供可编辑的帮助文字。我有类似的东西:

helptext.models.py:

from django.contrib.contenttypes.models import ContentType

class HelpText(models.Model):
    the_model = models.ForeignKey(ContentType)
    the_field = models.CharField(max_length=255)
    helptext = models.CharField(max_length=128)
    def __unicode__(self):
        return self.helptext

那么,除了在渲染模板时查看帮助文本是否与每个字段关联时,必须比较HelpText.the_modelHelpText.the_field CharFields,更好的方法是什么?屏幕?

提前致谢!

修改

我知道字段的help_text参数,但是我希望通过GUI轻松编辑它,它可能包含很多关于样式等的帮助。它可能是HTML,可能超过50-60行可能有100个不同的模型字段的文本。出于这些原因,我不想将其存储在字段定义中。

我更改了HelpText模型以引用ContentType,将字段引用为CharField。这似乎是一个很好的解决方案吗?我不确定这是最优雅的方式。请指教。

编辑2013-04-19 16:53 PST:

目前,我试过这个并且它有效,但不确定这很棒:

from django.db import models
from django.contrib.contenttypes.models import ContentType

# Field choices for the drop down.
FIELDS = ()

# For each ContentType verify the model_class() is not None and if not, add a tuple
# to FIELDS with the model name and field name displayed, but storing only the field
# name.
for ct in ContentType.objects.all():
    m = ct.model_class()
    if m is not None:
        for f in ct.model_class()._meta.get_all_field_names():
            FIELDS += ((f, str(ct.model) + '.' + str(f)),)


# HelpText model, associated with multiple models and fields.
class HelpText(models.Model):
    the_model = models.ForeignKey(ContentType)
    the_field = models.CharField(max_length=255, choices=FIELDS)
    helptext = models.TextField(null=True, blank=True)

    def __unicode__(self):
        return self.helptext

感觉不是最好的,但请告知这是否是一个会让我在后面陷入困境的解决方案,让我感到遗憾......:*(

1 个答案:

答案 0 :(得分:0)

解决方案有效,我实现了它,但您必须注意有时ContentTypes与您的模型不同步。您可以使用以下方法手动更新内容类型:

python manage.py shell
>>> from django.contrib.contenttypes.management import update_all_contenttypes
>>> update_all_contenttypes(interactive=True)

这允许您添加新的并删除旧的(如果存在)。

Field不是外键的好处是我可以在其中添加任何内容以获取帮助文本。所以,假设我有一个字段“名字”。我可以将一个帮助文本连接到Person模型和“first_name”字段。我也可以做点什么,比如“真的让人困惑”。现在,helptext与Person模型和“Something really confusing”字段相关联。所以,我可以将它放在表单的顶部,而不是与具有硬外键的字段相关联。它可以是任意的任何东西,随之而来的都是“领域”。挂断的是,您可能会更改helptext字段关联的名称,无意中将您的原始帮助文本发送到永不着陆。

为了简单起见,我创建了一个TemplateTag,我传递了模型的名称和我要关联的“字段”的名称。然后,只要呈现模板,该帮助文本就在那里,任何人都可以编辑它们的用户界面表单。

不确定这是最好的解决方案,但我真的看不到任何其他方法,并且没有得到任何回复。

Cheerio!