我的应用中有几个带有多个字段的模型。我想为用户设置一种方法,以便能够为模型中的每个字段修改帮助文本系统。您能否就如何设计模型以及使用哪些字段类型给出一些指导?我觉得将模型和字段名称存储在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.duties
,RollerCoaster.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.the_model
和HelpText.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
感觉不是最好的,但请告知这是否是一个会让我在后面陷入困境的解决方案,让我感到遗憾......:*(
答案 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!