質問編集履歴
1
追加ファイルとファイル構造を記載しました。
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
|
1
|
+
djangoでjsファイルが反応しない
|
body
CHANGED
@@ -4,8 +4,26 @@
|
|
4
4
|
デバッグを見るとjsファイルは読み込まれているようですが、反応していません。
|
5
5
|
解決していただけると助かります。
|
6
6
|
|
7
|
+
|
7
8
|
エラーメッセージはありませんが、デバッグをfluseにすると500エラーが発生します。
|
8
9
|
|
10
|
+
**試したこと**
|
11
|
+
・スーパーリロード
|
12
|
+
・django-static-md5urlを使う
|
13
|
+
・キャッシュバスティングの設定(500エラーの発生)
|
14
|
+
|
15
|
+
**ファイル構造**
|
16
|
+
cissapp/
|
17
|
+
├ciss
|
18
|
+
| └views.py
|
19
|
+
├static
|
20
|
+
| └js
|
21
|
+
| └vote.js
|
22
|
+
├template
|
23
|
+
| └detail.html
|
24
|
+
|
25
|
+
|
26
|
+
|
9
27
|
views.py
|
10
28
|
```views.py
|
11
29
|
class TopicDetailView(FormView):
|
@@ -42,42 +60,17 @@
|
|
42
60
|
```
|
43
61
|
models.py
|
44
62
|
```models.py
|
45
|
-
from django.db import models
|
46
|
-
from django.utils import timezone
|
47
|
-
from django.contrib.auth import get_user_model
|
48
|
-
|
49
|
-
|
50
63
|
class Data(models.Model):
|
51
64
|
category = models.CharField("科目種別", blank=True, max_length=100)
|
52
65
|
no = models.CharField("授業番号", blank=True, max_length=10)
|
53
66
|
semester = models.CharField("学期", blank=True, max_length=5)
|
54
67
|
day = models.CharField("曜日", blank=True, max_length=1)
|
55
68
|
name = models.CharField("科目", blank=True, max_length=20)
|
56
|
-
period = models.CharField("時限", blank=True, max_length=2)
|
57
|
-
teacher = models.CharField("担当教員", blank=True, max_length=30)
|
58
|
-
credit = models.CharField("単位", blank=True, max_length=1)
|
59
69
|
|
60
|
-
class Meta:
|
61
|
-
verbose_name = '授業'
|
62
|
-
verbose_name_plural = '授業一覧'
|
63
70
|
|
64
71
|
def __str__(self):
|
65
72
|
return(self.name)
|
66
73
|
|
67
|
-
|
68
|
-
# Create your models here.
|
69
|
-
class TopicManager(models.Manager):
|
70
|
-
# Topic操作に関する処理を追加
|
71
|
-
pass
|
72
|
-
|
73
|
-
class CommentManager(models.Manager):
|
74
|
-
# Comment操作に関する処理を追加
|
75
|
-
pass
|
76
|
-
|
77
|
-
class CategoryManager(models.Manager):
|
78
|
-
# Category操作に関する処理を追加
|
79
|
-
pass
|
80
|
-
|
81
74
|
class Topic(models.Model):
|
82
75
|
id = models.BigAutoField(
|
83
76
|
primary_key=True,
|
@@ -113,16 +106,8 @@
|
|
113
106
|
pub_flg = models.BooleanField(
|
114
107
|
default=True,
|
115
108
|
)
|
116
|
-
modified = models.DateTimeField(
|
117
|
-
auto_now=True,
|
118
|
-
)
|
119
|
-
objects = TopicManager()
|
120
109
|
|
121
|
-
class Meta:
|
122
|
-
verbose_name = '投稿'
|
123
|
-
verbose_name_plural = '投稿一覧'
|
124
110
|
|
125
|
-
|
126
111
|
def __str__(self):
|
127
112
|
return '{}-{}'.format(self.data.id, self.no)
|
128
113
|
|
@@ -189,27 +174,11 @@
|
|
189
174
|
```
|
190
175
|
setting.py
|
191
176
|
```ここに言語を入力
|
192
|
-
import os
|
193
|
-
from pathlib import Path
|
194
177
|
|
195
|
-
# Build paths inside the project like this: BASE_DIR / 'subdir'.
|
196
|
-
BASE_DIR = Path(__file__).resolve().parent.parent
|
197
|
-
|
198
|
-
|
199
|
-
# Quick-start development settings - unsuitable for production
|
200
|
-
# See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/
|
201
|
-
|
202
|
-
# SECURITY WARNING: keep the secret key used in production secret!
|
203
|
-
SECRET_KEY = 'hiv6*!i=apr-fcaxpahnt!*!(up^&2r)p57z0=d$t*pk6*izv@'
|
204
|
-
|
205
|
-
# SECURITY WARNING: don't run with debug turned on in production!
|
206
178
|
DEBUG = True
|
207
179
|
|
208
180
|
ALLOWED_HOSTS = ['*']
|
209
181
|
|
210
|
-
|
211
|
-
# Application definition
|
212
|
-
|
213
182
|
INSTALLED_APPS = [
|
214
183
|
'accounts.apps.AccountsConfig',
|
215
184
|
'cissapp.apps.CissappConfig',
|
@@ -228,91 +197,85 @@
|
|
228
197
|
'127.0.0.1',
|
229
198
|
]
|
230
199
|
|
200
|
+
STATIC_URL = '/static/'
|
231
|
-
|
201
|
+
STATICFILES_DIRS = [
|
232
|
-
'django.middleware.security.SecurityMiddleware',
|
233
|
-
'django.contrib.sessions.middleware.SessionMiddleware',
|
234
|
-
|
202
|
+
os.path.join(BASE_DIR, 'static'),
|
235
|
-
'django.middleware.csrf.CsrfViewMiddleware',
|
236
|
-
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
237
|
-
'django.contrib.messages.middleware.MessageMiddleware',
|
238
|
-
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
239
|
-
'debug_toolbar.middleware.DebugToolbarMiddleware', # Deubg tool bar
|
240
203
|
]
|
204
|
+
```
|
205
|
+
vote.js
|
206
|
+
```ここに言語を入力
|
207
|
+
$(function(){
|
208
|
+
// setup for ajax
|
209
|
+
var csrftoken = getCookie('csrftoken');
|
210
|
+
$.ajaxSetup({
|
211
|
+
beforeSend: function(xhr, settings) {
|
212
|
+
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
|
213
|
+
xhr.setRequestHeader("X-CSRFToken", csrftoken);
|
214
|
+
}
|
215
|
+
}
|
216
|
+
});
|
241
217
|
|
242
|
-
|
218
|
+
var votedList = [];// 連打防止用のコメントID格納リスト
|
219
|
+
// いいねボタン押下時の処理
|
220
|
+
onClickVoteButton();
|
243
221
|
|
222
|
+
function getCookie(name) {
|
244
|
-
|
223
|
+
var cookieValue = null;
|
245
|
-
{
|
246
|
-
|
224
|
+
if (document.cookie && document.cookie !== '') {
|
225
|
+
var cookies = document.cookie.split(';');
|
226
|
+
for (var i = 0; i < cookies.length; i++) {
|
227
|
+
var cookie = jQuery.trim(cookies[i]);
|
247
|
-
|
228
|
+
// Does this cookie string begin with the name we want?
|
248
|
-
'APP_DIRS': True,
|
249
|
-
'OPTIONS': {
|
250
|
-
'context_processors': [
|
251
|
-
'django.template.context_processors.debug',
|
252
|
-
'django.template.context_processors.request',
|
253
|
-
'django.contrib.auth.context_processors.auth',
|
254
|
-
|
229
|
+
if (cookie.substring(0, name.length + 1) === (name + '=')) {
|
230
|
+
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
|
255
|
-
|
231
|
+
break;
|
256
|
-
|
232
|
+
}
|
257
|
-
|
233
|
+
}
|
258
|
-
|
234
|
+
}
|
235
|
+
return cookieValue;
|
236
|
+
}
|
259
237
|
|
238
|
+
function csrfSafeMethod(method) {
|
239
|
+
// these HTTP methods do not require CSRF protection
|
260
|
-
|
240
|
+
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
|
241
|
+
}
|
261
242
|
|
243
|
+
function onClickVoteButton() {
|
244
|
+
$('.vote_button').on('click', function() {
|
245
|
+
var commentId = $(this).data('comment-id');
|
262
|
-
|
246
|
+
var currentCount = $(this).data('count');
|
247
|
+
var countViewer = $(this).find('.vote_counter');
|
248
|
+
if (votedList.indexOf(commentId) < 0) {
|
249
|
+
vote(commentId, currentCount, countViewer);
|
250
|
+
}
|
251
|
+
});
|
252
|
+
}
|
263
253
|
|
264
|
-
|
265
|
-
# Database
|
266
|
-
# https://docs.djangoproject.com/en/3.1/ref/settings/#databases
|
267
|
-
|
268
|
-
DATABASES = {
|
269
|
-
|
254
|
+
// ajax通信して投票結果を反映する
|
270
|
-
|
255
|
+
function vote(commentId, currentCount, countViewer) {
|
271
|
-
|
256
|
+
let url = '/api/v1/vote/';
|
257
|
+
$.ajax({
|
258
|
+
type: 'POST',
|
259
|
+
url: url,
|
260
|
+
data: {
|
261
|
+
comment_id: commentId
|
262
|
+
}
|
263
|
+
}).then(
|
264
|
+
data => {
|
265
|
+
if (data.result) {
|
266
|
+
countViewer.text(currentCount + 1);
|
267
|
+
votedList.push(commentId);
|
268
|
+
}
|
269
|
+
},
|
270
|
+
error => {
|
271
|
+
if (error.responseJSON.message) {
|
272
|
+
alert(error.responseJSON.message);
|
273
|
+
}
|
274
|
+
}
|
275
|
+
);
|
272
276
|
}
|
273
|
-
}
|
274
277
|
|
275
278
|
|
276
|
-
|
279
|
+
});
|
277
|
-
# https://docs.djangoproject.com/en/3.1/ref/settings/#auth-password-validators
|
278
280
|
|
279
|
-
AUTH_PASSWORD_VALIDATORS = [
|
280
|
-
{
|
281
|
-
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
|
282
|
-
},
|
283
|
-
{
|
284
|
-
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
|
285
|
-
},
|
286
|
-
{
|
287
|
-
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
|
288
|
-
},
|
289
|
-
{
|
290
|
-
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
|
291
|
-
},
|
292
|
-
]
|
293
|
-
|
294
|
-
|
295
|
-
# Internationalization
|
296
|
-
# https://docs.djangoproject.com/en/3.1/topics/i18n/
|
297
|
-
|
298
|
-
LANGUAGE_CODE = 'ja'
|
299
|
-
|
300
|
-
TIME_ZONE = 'Asia/Tokyo'
|
301
|
-
|
302
|
-
USE_I18N = True
|
303
|
-
|
304
|
-
USE_L10N = True
|
305
|
-
|
306
|
-
USE_TZ = True
|
307
|
-
|
308
|
-
|
309
|
-
# Static files (CSS, JavaScript, Images)
|
310
|
-
# https://docs.djangoproject.com/en/3.1/howto/static-files/
|
311
|
-
|
312
|
-
STATIC_URL = '/static/'
|
313
|
-
STATICFILES_DIRS = [
|
314
|
-
os.path.join(BASE_DIR, 'static'),
|
315
|
-
]
|
316
|
-
|
317
|
-
#STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'
|
318
281
|
```
|