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.interestsおよびに編集可能なヘルプ テキストを表示したいとします。私は次のようなものがあります:Job.dutiesRollerCoaster.scare_factorBigDipper.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

最高のようには感じませんが、これが後で私を苦しめ、後悔に満ちた解決策であるかどうかアドバイスしてください... :*(

4

1 に答える 1

0

ソリューションは機能し、実装しましたが、ContentTypes がモデルと同期しなくなる場合があることに注意する必要があります。これでコンテンツタイプを手動で更新できます:

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

これにより、新しいものを追加したり、古いものがある場合は削除したりできます。

Field が外部キーではないことの良い点は、ヘルプ テキストとして何でも入れることができることです。たとえば、「名」というフィールドがあるとします。Person モデルと「first_name」フィールドに接続されたヘルプテキストを配置できます。「すごくややこしい」とか、でっち上げることもできます。ヘルプテキストは、Person モデルと「何か本当にわかりにくい」フィールドに関連付けられました。したがって、ハード外部キーイングでフィールドに関連付ける代わりに、フォームの上部に配置できます。それは任意のものである可能性があり、その「フィールド」がどこにでも続きます。問題は、ヘルプテキスト フィールドの関連付けの名前を誤って変更して、元のヘルプテキストをネバー ランドに送信してしまう可能性があることです。

これを簡単にするために、モデルの名前と関連付けたい「フィールド」の名前を渡す TemplateTag を作成しました。次に、テンプレートがレンダリングされるたびに、そのヘルプテキストがそこにあり、誰でもユーザー インターフェイス フォームを支援するために編集できます。

これが最善の解決策かどうかはわかりませんが、他に方法が見つからず、応答がありませんでした。

チェリオ!

于 2013-05-01T19:45:27.250 に答える