4

Djangoの機能

Djangoのモデルフィールドの「空白」属性、およびモデルフォームを作成するときに否定されてフォームフィールドの「必須」属性に変換される方法は、かなりクールです。これにより、プロパティが属するモデルにプロパティを設定できますが、そこから作成されたModelFormを処理するときに「required」属性を使用できます。テンプレートでレンダリングするときに「必須」を使用できるということは、必須フィールドの表示ラベルにアスタリスクを追加するなどのクールなことができることを意味します。

モデル

class Employee(models.Model):
    name = models.CharField(blank=False)
    public_bio = models.TextField(blank=False)
    salary= models.DecimalField(max_digits=15, decimal_places=2, blank=False)
    personnel_notes = models.TextField(blank=True)

テンプレート(ModelFormを使用)

{% for field in form %}
    <p>
       {{ field.label }}{% if field.required %}*{% endif %}
       {{ field }}
    </p>
{% endfor %}

やりたいこと

しかし、自分の新しい属性でそれを実行したい場合はどうなりますか?空白->必須のように否定/変換する必要はありませんが、モデルフィールドで定義された新しい属性にフォームフィールドでアクセスできるようにする必要があります。たとえば、公開される可能性のあるフィールドをユーザーに明示したいとします。

モデル

class Employee(models.Model):
    name = models.CharField(blank=False, publishable=True)
    public_bio = models.TextField(blank=False, publishable=True)
    salary= models.DecimalField(max_digits=15, decimal_places=2, blank=False, publishable=False)
    personnel_notes = models.TextField(blank=True, publishable=False)

テンプレート(ModelFormを使用)

{% for field in form %}
    <p>
       {{ field.label }}{% if field.required %}*{% endif %}
       {% if field.publishable %}(may be published){% endif %}
       {{ field }}
    </p>
{% endfor %}

これを行う方法はありますか?それを試してみると、モデル定義ですぐに問題が発生django.db.models.fields.Field.__init__()し、kwargsさえ受け入れられません。これが不可能な場合、目的の動作を実現するための回避策のアイデアはありますか?

4

2 に答える 2

1

公開可能は、モデルに表示されるように、models.Fieldではなくforms.Fieldのプロパティである必要があることに注意してください。

フォームの開始時に公開可能にしたいフィールドにこれを明示的に追加できます。これにより、レンダリング中に使用できるようになります。

class PublishableForm(forms.Form):
    name = forms.CharField()

    def __init__(*args, **kwargs)
       super(PublishableForm, self).__init__(*args, **kwargs)
       self.name.publishable = True
于 2010-10-10T06:48:27.310 に答える
0

モデルフィールド用の一種のデコレータを作成することもできます。

def publishable(field):
    field.publishable = True
    return field

#...

name = publishable(models.CharField(...))

次に、フォームをオーバーライド__init__して、これらのフィールドを使用します。

{{ form.name }}また、テンプレートで使用するとBoundFieldが返されることを忘れないでください。元のフォームフィールドを取得するには、を使用する必要があります{{ form.name.field }}

于 2010-10-11T07:50:13.260 に答える