2011-07-09 14 views
27

私はDjangoの新機能ですが、Javaの世界で何年ものコーディング経験があるので、私はこの疑問を聞いています。私はちょうどそれを逃している。私はGoogleや何かでこれをクエリする正しい方法を見つけることができないようだ...私はdjangoのドキュメントを検索し、それはそこにないか、私はそれを見ていないだけです。私がしたいのは、varが空でないか、空の文字列であるか、空白だけであるかのテンプレートテストです。私はスペースが私のフィールドに導入されている問題を持っています - もう一つの問題ですが、うまくいくでしょう...しかし、私はロジックが無関係に働くことを望みます。今のところ、私の文字列には空白が含まれているだけなので、{%if lesson.assignment%}はそれが欲しいとは思っていません。私は{%%}の間で動作するトリム型の機能を探しましたが、何も見つかりませんでした。私はストリップを試みましたが、{%%}の間では動作しません。誰かが答えの方向で私を指してもいいですか...いくつかのドキュメント私は逃したかもしれない...何か?Python Django変数がnullか空文字列の場合のテンプレートとテスト

事前におねがいします!

答えて

44
{% if lesson.assignment and lesson.assignment.strip %} 

.strip通話str.strip()前のチェックは必ず私たちは(.strip()メソッドを持っていないであろう)None最初に取り除くになりながら、そうあなたは、空のように空白のみの文字列を扱うことができ、それが動作することを

証明(./manage.py shell中):

>>> import django 
>>> from django.template import Template, Context 
>>> t = Template("{% if x and x.strip %}OK{% else %}Empty{% endif %}") 
>>> t.render(Context({"x": "ola"})) 
u'OK' 
>>> t.render(Context({"x": " "})) 
u'Empty' 
>>> t.render(Context({"x": ""})) 
u'Empty' 
>>> t.render(Context({"x": None})) 
u'Empty' 
+0

@ PaulP1975:もし 'if'で' and'を使うのが最近Djangoに追加されたので、あなたはそれを見逃したでしょう。 –

1

cut filterを使用してすべてのスペースを削除してシミュレーションできます。しかし、おそらく最初の場所にすべてのスペースが含まれている理由を知るべきでしょう。

+0

はい、私はそれがすべてのスペースを持っているという事実を修正していきます。しかし、私はそれをどちらかの方法で動作させたいし、ストリップ機能を働かせることができませんでした(上記のShawnのコードはうまくいきました)。 – PaulP1975

0

Djangoテンプレート変数内の任意のビルトインメソッドを呼び出すことができます。たとえば、Pythonの文字列メソッドstripを呼び出すことができます。だから、これは動作します:

{% if lesson.assignment.strip %} 
+0

問題: 'CharField'はNULLを許すので、' None'は 'strip'メソッドを持たないのでNULLフィールドは例外を引き起こします。 –

+0

なぜか分かりませんが、初めてこれをやろうとしたときに失敗しました...例外的な条件(null)を打つ可能性があります...私は覚えがたいです。 – PaulP1975

5

lesson.assignmentはモデルフィールドである場合、あなたはあなたのモデルにヘルパー関数を定義することができ、それを使用します。その後、あなたのテンプレートで{% if lesson.has_assignment %}を使用

class Lesson(models.Model): 
    assignment = models.CharField(..., null=True, ...) 
    # ... 

    @property 
    def has_assignment(self): 
     return self.assignment is not None and self.assignment.strip() != "" 

を。

+0

これは興味深いオプションです...私はテンプレートのロジックをどのようにクリーンアップするのが大好きです。私は非常にPythonとDjangoに新しいので、私はまだロープを学んでいます。この提案をありがとう! – PaulP1975

5

質問が投稿されたとき、これは利用されていないかもしれないが、1つのオプションは、テンプレートフィルタdefault_if_noneに建て(を使用することができ)。例えば

{{ lesson.assignment|default_if_none:"Empty" }}

関連する問題