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

質問編集履歴

1

文章とタイトルの見直し

2019/01/29 06:33

投稿

sr2460
sr2460

スコア50

title CHANGED
@@ -1,1 +1,1 @@
1
- <python,django>同プロジェクトかつ別のアプリケーションをエラーなく表示させたい
1
+ <python,django>別のアプリケーションのclass内関数importしたい
body CHANGED
@@ -41,16 +41,25 @@
41
41
  └─polls
42
42
 
43
43
 
44
- boardアプリケーションにおいてpollsアプリーケーションに存在するmodels.pyの
44
+ pollsアプリーケーションに存在するmodels.pyの
45
45
 
46
46
  ```python
47
47
  class Question(models.Model):
48
48
  question_text = models.CharField(max_length=200)
49
49
  pub_date = models.DateTimeField('date published')
50
50
  date_limit = models.DateTimeField('公開期限', default = timezone.now() + timedelta(days=7) )
51
+
52
+
53
+ def is_date_limit(self):
54
+ # まだ公開期限を過ぎていないならTrue
55
+ now = timezone.now()
56
+ return now <= self.date_limit
57
+
58
+
59
+
51
60
  ```
52
61
 
53
- question_textを取得して表示し最終的にはdate_limitが最新のものやdate_limitが現在日時を過ぎていないもの全てを表示しようとしています。
62
+ question_textを取得して、別アプリケーションであるboardアプリケーションに表示しようとしています。
54
63
 
55
64
 
56
65
  ### 該当のソースコード
@@ -60,6 +69,10 @@
60
69
 
61
70
  ```python
62
71
 
72
+ import sys
73
+ sys.path.append('../')
74
+ from polls.models import Question
75
+
63
76
  class FormAndListView(FormView, ListView, TemplateResponseMixin):
64
77
  def get(self, request, *args, **kwargs):
65
78
  question = Question.objects.all() ←追加
@@ -77,7 +90,7 @@
77
90
 
78
91
  ```
79
92
 
80
- <p><a href="http://localhost:8000/polls/">現在おこなっているアンケート:{% for questions in question %}{{ questions.question_text }}{% endfor %}</a></p>
93
+ <p><a href="http://localhost:8000/polls/">現在投票中のアンケート一覧{% if question.is_date_limit %}{% for questions in question %}{{ questions.question_text }}{% endfor %}{% endif %}</a></p>
81
94
 
82
95
 
83
96
  ```
@@ -86,35 +99,64 @@
86
99
  この状態ですと
87
100
  ![イメージ説明](7fb457309335f4b0f62521055699cfe1.png)
88
101
 
89
- 一番上にquestion_textの内容が表示され、ここまでは問題ありませ
102
+ 一番上にquestion_textの内容が表示され、ここまでは問題ありませでした
90
103
 
91
104
 
92
105
  ###試したこと、発生するエラー
93
106
 
94
- まずはfor文ですべてのリストを表示からフィルターをかけること挑戦しようと思いboard.html
107
+ しかしさらにboard.htmlを改造し、
95
108
 
96
109
  ```
110
+
97
- <p><a href="http://localhost:8000/polls/">現在おこなっているアンケート:{{% for questions in question }}{{ questions.question_text }}{{% endfor %}}</a></p>
111
+ <p><a href="http://localhost:8000/polls/">現在投票中のアンケート一覧{% if question.is_date_limit %}{% for questions in question %}<li>{{ questions.question_text }}</li>{% endfor %}{% endif %}</a></p>
112
+
98
113
  ```
99
114
 
100
- 変更したころ
115
+ する今度は質問が表示されなくなってしまいます。
116
+ おそらくpollsアプリケーションのmodels.py内にある
101
117
 
102
118
  ```
103
- 'Question' object is not iterable
104
119
 
120
+ class Question(models.Model):
121
+ question_text = models.CharField(max_length=200)
122
+ pub_date = models.DateTimeField('date published')
123
+ date_limit = models.DateTimeField('公開期限', default = timezone.now() + timedelta(days=7) )
124
+
125
+
126
+ def is_date_limit(self):
127
+ # まだ公開期限を過ぎていないならTrue
128
+ now = timezone.now()
129
+ return now <= self.date_limit
130
+
131
+
105
132
  ```
106
- とエラーが出てしまいました。
107
133
 
134
+ class Question(models.Model):内のdef is_date_limit(self):
135
+ にアクセスできていないことが原因なのだと思います。
108
136
 
109
137
 
138
+ boardアプリケーションからpollsアプリケーションのmodel.pyにあるclass Qusetionまでは呼び出せるのですがclass内関数まではimportできないようで、解決のため試行錯誤しております。
110
139
 
140
+ boardアプリケーションのviews.py
141
+ ```
111
- また、ここを参考に
142
+ import sys
143
+ sys.path.append('../')
144
+ from polls.models import Question ←ここまでは問題ない
112
- [https://stackoverflow.com/questions/17473775/questions-object-is-not-iterable-django](https://stackoverflow.com/questions/17473775/questions-object-is-not-iterable-django)
145
+ from polls.models import Question.is_date_limit ←ここがおそらく間違っている
113
146
 
147
+ ```
114
148
 
149
+ エラーメッセージはこのように表示されております
150
+ ```
151
+ from polls.models import is_date_limit
152
+ ImportError: cannot import name 'is_date_limit' from 'polls.models'
115
153
 
154
+ ```
116
155
 
156
+ 同アプリケーション内ならばis_date_limit関数は問題なく動作しているのですがそれを別のアプリケーションでも動作させるにはどうすればよいでしょうか?
157
+ アドバイスをいただけると幸いです。
117
158
 
159
+
118
160
  ### 補足情報(FW/ツールのバージョンなど)
119
161
 
120
162
  python=3.7.0