teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

削除

2020/03/17 02:35

投稿

quickquip
quickquip

スコア11327

answer CHANGED
@@ -33,6 +33,4 @@
33
33
  obj = None
34
34
  (以下略)
35
35
  ```
36
- となっていてこのコードで、ifタグの中で評価途中にVariableDoesNotExist例外が起きた式がNoneになるものと思われます。
36
+ となっていてこのコードで、ifタグの中で評価途中にVariableDoesNotExist例外が起きた式がNoneになるものと思われます。
37
-
38
- 一般にundocumentedな仕様を当てにする行為は危険なわけですが、じゃあ他にどうすればいいのかというと答えはないかと。

1

追記

2020/03/17 02:35

投稿

quickquip
quickquip

スコア11327

answer CHANGED
@@ -9,4 +9,30 @@
9
9
 
10
10
  {% endif %}
11
11
  ```
12
- でいいです(が、存在しない属性にアクセスするとNoneを返す、という仕様がドキュメントのどこに書いてあるのかは謎でした)。
12
+ でいいです(が、存在しない属性にアクセスするとNoneを返す、という仕様がドキュメントのどこに書いてあるのかは謎でした)。
13
+
14
+ ----
15
+
16
+ (追記)
17
+
18
+ 色々と気になったのでソースを追うと、
19
+
20
+ [https://github.com/django/django/blob/3.0.4/django/template/defaulttags.py#L876](https://github.com/django/django/blob/3.0.4/django/template/defaulttags.py#L876)
21
+ ```python
22
+ def eval(self, context):
23
+ return self.value.resolve(context, ignore_failures=True)
24
+ ```
25
+ していて
26
+
27
+ [https://github.com/django/django/blob/3.0.4/django/template/base.py#L673](https://github.com/django/django/blob/3.0.4/django/template/base.py#L673)
28
+ ```python
29
+ try:
30
+ obj = self.var.resolve(context)
31
+ except VariableDoesNotExist:
32
+ if ignore_failures:
33
+ obj = None
34
+ (以下略)
35
+ ```
36
+ となっていてこのコードで、ifタグの中で評価途中にVariableDoesNotExist例外が起きた式がNoneになるものと思われます。
37
+
38
+ 一般にundocumentedな仕様を当てにする行為は危険なわけですが、じゃあ他にどうすればいいのかというと答えはないかと。