1

これが私のコードです:

[{{thing.syncedthing_set.all.0.state}}]
{% ifequal thing.syncedthing_set.all.0.state "InProgress" %}
    It worked
{% endifequal %}

結果:

[InProgress]

つまり、変数ルックアップは機能しますが、「ifequal」テストに合格していません。変数ルックアップがサポートされていない以外に、これが機能しない理由は考えられません。

2007年から、当時はサポートされていなかったというメーリングリストメッセージがあります:https ://groups.google.com/forum/?fromgroups#!topic / django -users / oU1im3UTcLc-これはまだ当てはまりますか?

もしそうなら、何か良い回避策はありますか?この場合、テンプレートを呼び出すPythonコードを変更するのは簡単ではありません。

それらが機能する必要がある場合-他の考えられる原因はありますか?

これと非常によく似た質問がありますが、答えは私にはうまくいきません。私はDjango1.3を使用しています。

編集

さて、「状態」には型クラスがあります。定義を調べると、stateは、最終的にモデルをサブクラス化するクラスを参照します。フィールド:

class FSMField(models.Field):
    __metaclass__ = models.SubfieldBase

    states = {}
    """ Contains { 'Statename': StateClass, ... }"""

    def __init__(self, *args, **kwargs):
        kwargs.setdefault('max_length', 50)
        super(FSMField, self).__init__(*args, **kwargs)

    def to_python(self, value):
        if isinstance(value, State):
            return value
        return self.__class__.states.get(str(value))()

    def get_prep_value(self, value):
        return str(value)

    def get_internal_type(self):
        return 'CharField'

それを考えると、テンプレートシステムで実際の文字列値を取得する方法が実際にはわかりません。私の許しを許してください。

EDIT2実際には、関連するビットはおそらく「State」クラス自体です。

class State(object):
    """ A simple finite statement machine abstract class, with on_entry and on_exit events."""
    def __unicode__(self):
        return "%s" % (self.__class__.__name__)

    def __str__(self):
        return "%s" % (self.__class__.__name__)
4

2 に答える 2

2

オブジェクトの文字列表現と実際の表現には違いがあります。stateプロパティがユニコード表現がであるオブジェクトを返す可能性がありますがInProgress、実際には。と等しくなりません"InProgress"stateこれは、たとえば、が別のモデルへの外部キーである場合に当てはまります。この場合、ルックアップに別のレベルを追加するだけで、そのステータスを返す実際のフィールドに到達できます。

更新後に編集する残念ながら、あなたは自分自身を隅にコーディングしたと思います。状態を文字列として含む実際のインスタンス属性がないため、文字列比較を介して状態を取得する方法はありません。

いくつかの可能性が思い浮かびます。1つは、考えられるすべてのサブクラスを(おそらくコンテキストプロセッサを介して)テンプレートコンテキストに渡すことです。その後、実際のオブジェクトとState比較できるようになります。stateこれはかなりひどいです。

State別の方法は、クラスまたは場合によってはモデルに、状態を文字列として取得する関数を追加することです。これは既存の方法と同じくらい簡単かもしれ__unicode__ません(テンプレート言語はアンダースコアで始まる属性へのアクセスを禁止しているため、実際には使用できません)。次にifequal foo.bar.0.state.as_string "InProgress"、何でもできます。これにより、メソッドが呼び出され、as_string()比較が成功します。

于 2012-05-01T08:21:28.517 に答える
0

IFを使用してみてください:

{% if thing.syncedthing_set.all.0.state == "InProgress" %}
于 2012-05-01T08:11:45.143 に答える