7

(編集:実装について多くの回答を得ています(感謝しています)が、ここでは仕様の構文だけにもっと関心があります。このプラグインのユーザー(つまり、ウェブサイトのユーザーではなく、Python/Django 開発者)は条件を指定する必要があります、私が発明している構文で. 質問を言い換えると...モデルまたはフォームクラスを作成するとき...以下の構文のどれが典型的な Python/Django 開発者がフォームフィールドの条件付き表示ロジックを指定することを好むでしょうか? )

比較で後で使用するための比較演算子を指定するための最もpythonicな(読みやすく、簡単ななど)方法についてのアドバイスを探しています(javascriptを介して実行されます)。のようなもの (これは頭に浮かぶ一例にすぎません。他にも多くの可能な形式があります):

comparisons = (('a', '>', 'b'), ('b', '==', 'c'))

これは後で Javascript で評価されます。

コンテキストは、私が選択した構文で比較を記述する必要がある Django アプリ (最終的にはプラグインとして配布するため) に取り組んでいるということです (したがって、pythonic にすることについての質問)。比較はフォーム フィールドを参照し、最終的には JavaScript の条件付きフォーム表示に変換されます。例が適切であると思います:

class MyModel(models.Model):
    yes_or_no = models.SomeField...choices are yes or no...
    why = models.SomeField...text, but only relevant if yes_or_no == yes...
    elaborate_even_more = models.SomeField...more text, just here so we can have multiple conditions

    #here i am inventing some syntax...open to suggestions!!
    why.show_if = ('yes_or_no','==','yes')
    elaborate_even_more.show_if = (('yes_or_no','==','yes'),('why','is not','None'))

    #(EDIT - help me choose a syntax that is Pythonic and...Djangonic...and that makes your fingers happy to type!)
    #another alternative...
    conditions = {'why': ('yes_or_no','==','yes'), 
                  'elaborate_even_more': (('yes_or_no','==','yes'),('why','is not','None'))
                  }

    #or another alternative...
    """Showe the field whiche hath the name *why* only under that circumstance 
    in whiche the field whiche hath the name *yes_or_no* hath the value *yes*, 
    in strictest equality."""
    etc...

(手を振って... model_form_factory() を使用して MyModel を ModelForm に変換します...辞書内のすべての「field.show_if」条件を収集し、MyModelForm.conditions または何かとして ModelForm にアタッチします...)

テンプレート内の JavaScript のチャンクでは、MyModelForm.condtions の各条件が、フィールドの値の変更をリッスンし、それに応じて別のフィールドを表示または非表示にする関数になります。基本的に(疑似Javascript / Jqueryで):

when yes_or_no changes...
    if (yes_or_no.value == 'yes'){
        $('#div that contains *why* field).show(); }
    else {
        $('#div that contains *why* field).hide(); }

ここでの目標は、エンド ユーザーが条件付き表示ロジックをモデル定義内で単純な Python の方法で指定できるようにすることです (代わりに、フォーム クラスで条件を指定するオプションがある場合があります。これは、より「Djangonic」(? ?)、しかし私のユースケースでは、モデルに入れる必要があります)。次に、舞台裏のプラグインがそれをテンプレートの Javascript に変換します。したがって、Javascript を記述することなく、条件付きフォームの表示を取得できます。これは python/django 開発者の手に委ねられるため、これらの条件を指定するための最もネイティブで快適な方法の提案を探しています。

4

5 に答える 5

3

ここにアイデアがあります:

import operator as op

a, b, c = 10, 7, 7

def f1():
    print 10

def f2():
    print 20

comparisons = ((a, op.gt, b, f1), (b, op.eq, c, f2))

for lhs, oper, rhs, f in comparisons:
    if oper(lhs, rhs):
        f()

=> 10
=> 20

適切な表現を使用すると、比較演算子とそれに対応するアクションを動的に指定できます - 関数として実装されます。operatorモジュールを見て、使用可能な演算子を確認してください。

于 2013-08-28T16:19:59.177 に答える
1

クエリに django の構文を使用することについてどう思いますか?

>>> Entry.objects.filter(
...     headline__startswith='What'
... ).exclude(
...     pub_date__gte=datetime.date.today()
... ).filter(
...     pub_date__gte=datetime(2005, 1, 30)
... )

したがって、次のようになります。

class MyModel(models.Model):
    yes_or_no = models.SomeField()
    why = models.SomeField(yes_or_no='yes')
    ... or ...
    why = models.SomeField(field__yes_or_no='yes')
    ... or even ...
    why = models.SomeField(field__yes_or_no__contains='ye')
于 2013-08-28T16:32:58.480 に答える
0

これはやり過ぎかもしれませんが、Pyjaco ツールを使用して Python ソースを Javascript ソースにコンパイルできます。次に、通常の Python で比較を記述できます。ネイティブ Python より Pythonic になるのは難しい!

于 2013-08-28T17:51:51.707 に答える