質問編集履歴

3

わかりやすく

2021/05/15 12:06

投稿

Mitsu_
Mitsu_

スコア10

test CHANGED
File without changes
test CHANGED
@@ -4,19 +4,161 @@
4
4
 
5
5
  お世話になります。
6
6
 
7
+ メルカリのようなサイトを作っており、
8
+
7
- 、とても簡単なッセージアプリを作っております
9
+ ルカのコメント機能のところを作っております
10
+
8
-
11
+ ![イメージ説明](60e842999bdb7bdec369d7dae647be21.png)
12
+
13
+
14
+
15
+ 相手からのコメントをAjaxを使って自動的に取得したいです。
16
+
17
+
18
+
19
+ ### 発生している問題
20
+
9
- 送信受信はできるですが、ペジをリロードしなければ相手のメッセージを取得することがきないため、Ajaxを用いてメッセージを5秒間隔くらいで自動で取得しいです。
21
+ htmlのscriptタグのソスコードは、以前授業flaskを用いてメッセージアプリ作っときに、
22
+
10
-
23
+ 相手からのメッセージを自動で取得するために用いたものです。
11
-
12
-
24
+
13
- でHTMLへ書き方と、views.py, urls.pyで書き方をご教授願いたいです。
25
+ れを今、私が作っているDjangoアプリに取り入れ用したところ<script>タグ内中の
14
-
15
-
16
-
26
+
17
- 初心者のため、DjagoAjaxの書き方調べてもわからなかったため、質問させていただきました。 
27
+ {{to_user_id}}部分,つまり相手側idをどのようにけばいいのかがわから、質問させていただきました。
28
+
18
-
29
+ 自分側のidは request.user.idで取得できております。
30
+
19
- 初心者ゆえ、足りない情報がございましたら、アップいたしますので、どうぞよろしくお願いいたします。
31
+ どうぞよろしくお願いいたします。
32
+
33
+
34
+
35
+ **html**
36
+
37
+ ```
38
+
39
+ <script>
40
+
41
+ $(function(){
42
+
43
+ // 5秒間隔でget_new_messagesを実行
44
+
45
+ timer = setInterval("get_new_messages()", 5000);
46
+
47
+ // 初期表示で画面の一番下に行く
48
+
49
+ var scroll = (document.scrollingElement || document.body);
50
+
51
+ scroll.scrollTop = scroll.scrollHeight;
52
+
53
+ });
54
+
55
+ user_id = "{{ to_user_id }}";
56
+
57
+ function get_new_messages(){
58
+
59
+ $.getJSON("/message_ajax", {
60
+
61
+ user_id: user_id
62
+
63
+ }, function(data){
64
+
65
+ $('#message-form').before(data['data']);
66
+
67
+ });
68
+
69
+ };
70
+
71
+ </script>
72
+
73
+
74
+
75
+ <h3 class="text-center">商品名: {{product.product_name}}</h3>
76
+
77
+
78
+
79
+ <div class="row">
80
+
81
+ {% for comment in comments%}
82
+
83
+ {% if comment.user.id == request.user.id %}
84
+
85
+ <div class="speech-bubble-my col-lg-4 offset-lg-7" >
86
+
87
+ <!-- <p>{{ comment.user.username }}</p> -->
88
+
89
+ <p>{{ comment.comment | linebreaksbr}}</p>
90
+
91
+ </div>
92
+
93
+
94
+
95
+ <div class="col-lg-1">
96
+
97
+ <p>{{ comment.user.username }}</p>
98
+
99
+ </div>
100
+
101
+
102
+
103
+ {% else %}
104
+
105
+
106
+
107
+ <div class="col-lg-1">
108
+
109
+ <p>{{ comment.user.username }}</p>
110
+
111
+ </div>
112
+
113
+
114
+
115
+ <div class="speech-bubble-dest col-lg-4 " >
116
+
117
+ <!-- <p>{{ comment.user.username }}</p> -->
118
+
119
+ <p>{{ comment.comment | linebreaksbr}}</p>
120
+
121
+ </div>
122
+
123
+ <div class="col-lg-7"></div>
124
+
125
+ {% endif %}
126
+
127
+ {% endfor %}
128
+
129
+
130
+
131
+ {% if user.is_authenticated %}
132
+
133
+ <div class="col-4 offset-7" id="message-form">
134
+
135
+ <form method="POST">
136
+
137
+ {% csrf_token %}
138
+
139
+ {{ comments_form.as_p }}
140
+
141
+ <input type="submit" value="コメント送信">
142
+
143
+ </form>
144
+
145
+ </div>
146
+
147
+ {% endif %}
148
+
149
+
150
+
151
+ </div>
152
+
153
+ ```
154
+
155
+ メッセージを保管しているDB
156
+
157
+ product_idはユーザー登録した人が出品した商品のidです。
158
+
159
+ user_idはコメントを書いた人のidです。
160
+
161
+ ![イメージ説明](13ad0e089bdb4abbb9ff477ae5fb3583.png)
20
162
 
21
163
 
22
164
 
@@ -26,208 +168,70 @@
26
168
 
27
169
  ### 該当のソースコード
28
170
 
29
- **html**
30
-
31
- ```
32
-
33
- <div class="row">
34
-
35
- {% for comment in comments%}
36
-
37
- {% if comment.user.id == request.user.id %}
38
-
39
- <div class="speech-bubble-my col-lg-4 offset-lg-7" >
40
-
41
- <!-- <p>{{ comment.user.username }}</p> -->
42
-
43
- <p>{{ comment.comment | linebreaksbr}}</p>
44
-
45
- </div>
46
-
47
-
48
-
49
- <div class="col-lg-1">
50
-
51
- <p>{{ comment.user.username }}</p>
52
-
53
- </div>
54
-
55
-
56
-
57
- {% else %}
58
-
59
-
60
-
61
- <div class="col-lg-1">
62
-
63
- <p>{{ comment.user.username }}</p>
64
-
65
- </div>
66
-
67
-
68
-
69
- <div class="speech-bubble-dest col-lg-4 " >
70
-
71
- <!-- <p>{{ comment.user.username }}</p> -->
72
-
73
- <p>{{ comment.comment | linebreaksbr}}</p>
74
-
75
- </div>
76
-
77
- <div class="col-lg-7"></div>
78
-
79
- {% endif %}
80
-
81
- {% endfor %}
82
-
83
- <br>
84
-
85
- <br>
86
-
87
- <hr>
88
-
89
- <br>
90
-
91
- {% if user.is_authenticated %}
92
-
93
- <div class="col-4 offset-7" id="message-form">
94
-
95
- <form method="POST">
96
-
97
- {% csrf_token %}
98
-
99
- {{ comments_form.as_p }}
100
-
101
- <input type="submit" value="コメント送信">
102
-
103
- </form>
104
-
105
- </div>
106
-
107
- {% endif %}
108
-
109
-
110
-
111
- </div>
112
-
113
- {% endblock %}
114
-
115
- ```
116
-
117
-
118
-
119
-
120
-
121
-
122
-
123
-
124
-
125
-
126
-
127
- ### 試したこと
128
-
129
- flaskではこのようなやり方をしていたのですが、これをどのようにDjangoにあてはめるのかがわからないです。
130
-
131
- どうぞよろしくお願い申し上げます
132
-
133
-
134
-
135
- **html**
136
-
137
- ```
138
-
139
- <script>
140
-
141
- $(function(){
142
-
143
- // 5秒間隔でget_new_messagesを実行
144
-
145
- timer = setInterval("get_new_messages()", 5000);
146
-
147
- // 初期表示で画面の一番下に行く
148
-
149
- var scroll = (document.scrollingElement || document.body);
150
-
151
- scroll.scrollTop = scroll.scrollHeight;
152
-
153
- });
154
-
155
- user_id = "{{ to_user_id }}";
156
-
157
- function get_new_messages(){
158
-
159
- $.getJSON("/message_ajax", {
160
-
161
- user_id: user_id
162
-
163
- }, function(data){
164
-
165
- $('#message-form').before(data['data']);
166
-
167
- var checked_message_ids = data['checked_message_ids'];
168
-
169
- for(let idx = 0; idx < checked_message_ids.length; idx++){
170
-
171
- $('#self-message-tag-'+checked_message_ids[idx]).append('<p>既読</p>');
172
-
173
- }
174
-
175
- });
176
-
177
- };
178
-
179
- </script>
180
-
181
- ```
182
-
183
- **views.py**
184
-
185
- ```
186
-
187
- @bp.route('/message_ajax', methods=['GET'])
188
-
189
- @login_required
190
-
191
- def message_ajax():
192
-
193
- user_id = request.args.get('user_id', -1, type=int)
194
-
195
- # まだ読んでいない相手からのメッセージを取得
196
-
197
- user = User.select_user_by_id(user_id)
198
-
199
- not_read_messages = Message.select_not_read_messages(user_id, current_user.get_id())
200
-
201
- not_read_message_ids = [message.id for message in not_read_messages]
202
-
203
- if not_read_message_ids:
204
-
205
- with db.session.begin(subtransactions=True):
206
-
207
- Message.update_is_read_by_ids(not_read_message_ids)
208
-
209
- db.session.commit()
210
-
211
- # すでに読まれた自分のメッセージでまだチェックしていないものを取得
212
-
213
- not_checked_messages = Message.select_not_checked_messages(current_user.get_id(), user_id)
214
-
215
- not_checked_message_ids = [not_checked_message.id for not_checked_message in not_checked_messages]
216
-
217
- if not_checked_message_ids:
218
-
219
- with db.session.begin(subtransactions=True):
220
-
221
- Message.update_is_checked_by_ids(not_checked_message_ids)
222
-
223
- db.session.commit()
224
-
225
- return jsonify(data=make_message_format(user, not_read_messages), checked_message_ids = not_checked_message_ids)
226
-
227
-
228
-
229
- ```
230
-
231
- u
232
-
233
- ネットやJavascriptの本を購入し調べたのですが、Djangoでの書き方や応用が分からずにいます。
171
+
172
+
173
+ models.py
174
+
175
+ ```
176
+
177
+ class Comments(models.Model):
178
+
179
+ comment = models.CharField(max_length=1000)
180
+
181
+ user = models.ForeignKey('SellText.Users', on_delete=models.CASCADE)
182
+
183
+ product = models.ForeignKey('SellText.Product',on_delete=models.CASCADE)
184
+
185
+ objects = CommentsManager()
186
+
187
+ class Meta:
188
+
189
+ db_table='comments'
190
+
191
+ ```
192
+
193
+ views.py
194
+
195
+ ```
196
+
197
+ def post_comment(request, product_id):
198
+
199
+
200
+
201
+ comments_form =forms.CommentForm(request.POST or None)
202
+
203
+ # comment_product = Comments.objects.all()
204
+
205
+ product = Product.objects.get(id=product_id)
206
+
207
+ comments = Comments.objects.fetch_by_product_id(product_id)
208
+
209
+
210
+
211
+ if comments_form.is_valid():
212
+
213
+ if not request.user.is_authenticated:
214
+
215
+ raise Http404
216
+
217
+ comments_form.instance.product = product
218
+
219
+ comments_form.instance.user = request.user
220
+
221
+ comments_form.save()
222
+
223
+
224
+
225
+ return redirect('SellText:post_comment',product_id=product_id)
226
+
227
+ return render(request,'comment.html', context={
228
+
229
+ 'comments_form':comments_form,
230
+
231
+ 'comments':comments,
232
+
233
+ 'product':product
234
+
235
+ } )
236
+
237
+ ```

2

詳しく

2021/05/15 12:06

投稿

Mitsu_
Mitsu_

スコア10

test CHANGED
File without changes
test CHANGED
@@ -126,6 +126,108 @@
126
126
 
127
127
  ### 試したこと
128
128
 
129
-
129
+ flaskではこのようなやり方をしていたのですが、これをどのようにDjangoにあてはめるのかがわからないです。
130
+
131
+ どうぞよろしくお願い申し上げます
132
+
133
+
134
+
135
+ **html**
136
+
137
+ ```
138
+
139
+ <script>
140
+
141
+ $(function(){
142
+
143
+ // 5秒間隔でget_new_messagesを実行
144
+
145
+ timer = setInterval("get_new_messages()", 5000);
146
+
147
+ // 初期表示で画面の一番下に行く
148
+
149
+ var scroll = (document.scrollingElement || document.body);
150
+
151
+ scroll.scrollTop = scroll.scrollHeight;
152
+
153
+ });
154
+
155
+ user_id = "{{ to_user_id }}";
156
+
157
+ function get_new_messages(){
158
+
159
+ $.getJSON("/message_ajax", {
160
+
161
+ user_id: user_id
162
+
163
+ }, function(data){
164
+
165
+ $('#message-form').before(data['data']);
166
+
167
+ var checked_message_ids = data['checked_message_ids'];
168
+
169
+ for(let idx = 0; idx < checked_message_ids.length; idx++){
170
+
171
+ $('#self-message-tag-'+checked_message_ids[idx]).append('<p>既読</p>');
172
+
173
+ }
174
+
175
+ });
176
+
177
+ };
178
+
179
+ </script>
180
+
181
+ ```
182
+
183
+ **views.py**
184
+
185
+ ```
186
+
187
+ @bp.route('/message_ajax', methods=['GET'])
188
+
189
+ @login_required
190
+
191
+ def message_ajax():
192
+
193
+ user_id = request.args.get('user_id', -1, type=int)
194
+
195
+ # まだ読んでいない相手からのメッセージを取得
196
+
197
+ user = User.select_user_by_id(user_id)
198
+
199
+ not_read_messages = Message.select_not_read_messages(user_id, current_user.get_id())
200
+
201
+ not_read_message_ids = [message.id for message in not_read_messages]
202
+
203
+ if not_read_message_ids:
204
+
205
+ with db.session.begin(subtransactions=True):
206
+
207
+ Message.update_is_read_by_ids(not_read_message_ids)
208
+
209
+ db.session.commit()
210
+
211
+ # すでに読まれた自分のメッセージでまだチェックしていないものを取得
212
+
213
+ not_checked_messages = Message.select_not_checked_messages(current_user.get_id(), user_id)
214
+
215
+ not_checked_message_ids = [not_checked_message.id for not_checked_message in not_checked_messages]
216
+
217
+ if not_checked_message_ids:
218
+
219
+ with db.session.begin(subtransactions=True):
220
+
221
+ Message.update_is_checked_by_ids(not_checked_message_ids)
222
+
223
+ db.session.commit()
224
+
225
+ return jsonify(data=make_message_format(user, not_read_messages), checked_message_ids = not_checked_message_ids)
226
+
227
+
228
+
229
+ ```
230
+
231
+ u
130
232
 
131
233
  ネットやJavascriptの本を購入し調べたのですが、Djangoでの書き方や応用が分からずにいます。

1

わかりやすく

2021/05/15 05:50

投稿

Mitsu_
Mitsu_

スコア10

test CHANGED
File without changes
test CHANGED
@@ -14,7 +14,11 @@
14
14
 
15
15
 
16
16
 
17
- 初心者のため、DjagoでのAjaxの書き方が調べてもわからなかったため、質問させていただきました。 足りない情報がございましたら、アップいたしますので、どうぞよろしくお願いいたします。
17
+ 初心者のため、DjagoでのAjaxの書き方が調べてもわからなかったため、質問させていただきました。 
18
+
19
+ 初心者ゆえ、足りない情報がございましたら、アップいたしますので、どうぞよろしくお願いいたします。
20
+
21
+
18
22
 
19
23
 
20
24