我的应用程序中有几个具有多个字段的模型。我想为用户设置一种方法,以便能够为模型中的每个字段修改帮助文本系统。您能给我一些关于如何设计模型以及使用哪些字段类型的指导吗?我对在 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 是否与屏幕上的每个字段相关联时必须比较制作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
感觉不是最好的,但请告知这是否是一个解决方案,以后会咬我,让我充满遗憾......:*(