アプリにいくつかのフィールドを持ついくつかのモデルがあります。ユーザーがモデルの各フィールドのヘルプ テキスト システムを変更できるようにする方法を設定したいと考えています。モデルの設計方法と、使用するフィールド タイプについてのガイダンスを教えてください。モデルとフィールド名を 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
では、ヘルプテキストが画面上の各フィールドに関連付けられているかどうかを確認するためにテンプレートをレンダリングするときに比較する必要がある CharFields を作成する以外に、これを行うためのより良い方法は何HelpText.the_model
ですか?HelpText.the_field
前もって感謝します!
編集:
フィールドの help_text パラメーターについては知っていますが、これを GUI で簡単に編集できるようにしたいと考えており、スタイリングなどのヘルプがたくさん含まれている可能性があります。おそらく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
最高のようには感じませんが、これが後で私を苦しめ、後悔に満ちた解決策であるかどうかアドバイスしてください... :*(