1

我的应用程序中有几个具有多个字段的模型。我想为用户设置一种方法,以便能够为模型中的每个字段修改帮助文本系统。您能给我一些关于如何设计模型以及使用哪些字段类型的指导吗?我对在 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_factor、 和上有可编辑的帮助文本BigDipper.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 是否与屏幕上的每个字段相关联时必须比较制作HelpText.the_model和CharFields之外,还有什么更好的方法呢?HelpText.the_field

提前致谢!

编辑:

我知道这些字段的 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

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

4

1 回答 1

0

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

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

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

字段不是外键的好处是我可以在其中放入任何帮助文本。所以,假设我有一个字段“名字”。我可以将帮助文本连接到 Person 模型和“first_name”字段。我也可以编造一些东西,比如“一些真正令人困惑的东西”。帮助文本现在与 Person 模型和“Something really chaos”字段相关联。所以,我可以把它放在表单的顶部,而不是用硬外键关联到一个字段。它可以是任意的,并且会在任何地方跟随那个“字段”。问题在于您可能会更改帮助文本字段关联的名称,从而无意中将原始帮助文本发送到永不着陆。

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

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

干杯!

于 2013-05-01T19:45:27.250 回答