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

Django模型设计:单个模型字段的可编辑帮助文本。是否存在引用模型特定字段的外部字段?,django,django-models,model,Django,Django Models,Model,我的应用程序中有几个带有多个字段的模型。我想为用户设置一种方法,以便能够修改模型中每个字段的帮助文本系统。你能给我一些关于如何设计模型和使用什么字段类型的指导吗?我觉得在CharFields中存储模型和字段名是不对的,但如果这是唯一的方法,我可能会被它卡住 使用Django有更优雅的解决方案吗 举一个简单而愚蠢的例子,使用名为jobs的应用程序、名为fun的应用程序和名为helptext的新应用程序: jobs.models.py: class Person(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.interests
Job.tasks
过山车.scare\u factor
北斗七星上有可编辑的帮助文本。有史以来最好的评论。我要的是:

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之外,还有什么更好的方法来实现这一点呢?\u model
HelpText。在呈现模板时,必须比较的\u字段
CharFields,以查看HelpText是否与屏幕上的每个字段相关联

提前谢谢

编辑:

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

我更改了HelpText模型,使其具有对ContentType的引用和对CharField字段的引用。这似乎是一个好的解决方案吗?我不确定这是最优雅的方式。请告知

编辑2013-04-19 16:53太平洋标准时间:

目前,我尝试了这个方法,但不确定这是否很好:

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

感觉不是最好的,但请告诉我这是否是一个解决方案,它会在以后咬我的后腿,让我充满遗憾……:*(

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

python manage.py shell
>>> from django.contrib.contenttypes.management import update_all_contenttypes
>>> update_all_contenttypes(interactive=True)
这允许您添加新的和删除旧的(如果存在)

该字段不是外键的好处是,我可以在其中输入任何帮助文本。因此,假设我有一个字段“First Name”。我可以将一个helptext连接到Person模型和“First_Name”字段。我还可以编造一些东西,比如“非常混乱的东西”。helptext现在与Person模型和“非常令人困惑的东西”字段。因此,我可以将其放在表单的顶部,而不是将其与带有硬外键的字段相关联。它可以是任意的,并将跟随该“字段”“任何地方。问题是您可能会无意中更改helptext字段关联的名称,并将原始helptext发送到never land

为了简化这一过程,我创建了一个TemplateTag,我将模型的名称和要关联的“字段”的名称传递给它。然后,无论何时呈现模板,该帮助文本都在那里,任何人都可以编辑以获得用户界面表单的帮助

我不确定这是否是最好的解决方案,但我真的看不到其他方法,也没有得到回应

干杯