質問編集履歴

2

MD形式を質問内容を整理した。

2021/11/28 05:41

投稿

atk.on.fukukai
atk.on.fukukai

スコア2

test CHANGED
@@ -1 +1 @@
1
- Djangoでselectタグをdisabledにしたらform_invalidが発生
1
+ Djangoでselectタグをdisabledにしたらform_invalidが発生します回避策などアドバイスを頂けないでしょうか。
test CHANGED
@@ -1,41 +1,355 @@
1
+ ### 実現したいこと
2
+
3
+
4
+
5
+ こんにちは。
6
+
7
+ 以下のことを実現したいのですが、form_invalidが発生していまい困っています。
8
+
1
- んにちは。質問させてください。
9
+ お忙しとろ恐れ入りますが質問させてください。
2
10
 
3
11
 
4
12
 
5
13
  Djangoで以下のような画面を用意しました。
6
14
 
7
-
15
+ この画面からCustomUserモデルのフィールを編集できるようにしたいです。
8
-
16
+
9
- ![![イメージ説明](eb1552e2a25c89bc508df0dee5ca333c.png)](40869919043fb9a15af1a7a203fadec8.png)
17
+ ![![イメージ説明](eb1552e2a25c89bc508df0dee5ca333c.png)]
18
+
19
+
20
+
10
-
21
+ 会員ランクはForeignKeyを使っています。参照先はRankモデルになります。
22
+
11
-
23
+ selectタグから項目を選ぶことができます。
12
24
 
13
25
  ![イメージ説明](e0f6e04d3f7398bf3e8c30d3841c878d.png)
14
26
 
15
27
 
16
28
 
17
- 会員ランクの項目はmodels.ForeignKeyを使っています。
18
-
19
- この会員ランクを変更不可にしたいの「disabled」にしたら、
29
+ この会員ランクを変更不可にして、名前とメールアドレスだけ更新きるようにしたいです。
30
+
20
-
31
+ ![イメージ説明](9df40bbae0dbd2685884b90a895f9d67.png)
32
+
33
+
34
+
35
+ ### 発生している問題・エラーメッセージ
36
+
37
+
38
+
39
+ ```
40
+
41
+ 会員ランクのselectタグを変更できないようにdisabledに設定すると、
42
+
21
- Viewform_invalidが発生するようになってしまいました。
43
+ バリデーションが通らなくなりView(update_view.py)のform_invalidが発生するようになってしまいました。
22
-
23
-
24
-
25
- 調べたところ、会員ランクはselectタグで、
26
-
27
- selectタグをdisabledにしたらpostされない仕組みのようです。
28
-
29
- なので、form_invalidが発生している?
30
44
 
31
45
 
32
46
 
33
47
  なにか、解決策や代替案を頂けないでしょうか。
34
48
 
35
-
36
-
37
- よろしくお願いします。
38
-
39
-
40
-
41
- 以上
49
+ ```
50
+
51
+
52
+
53
+ ### 該当のソースコード
54
+
55
+ ```ここに言語を入力
56
+
57
+ 【update_view.pyのソース】
58
+
59
+ class UpdateView(OnlyYouMixin, UpdateView):
60
+
61
+ model = CustomUser
62
+
63
+ template_name = "act/update.html"
64
+
65
+ form_class = UpdateForm
66
+
67
+ success_url = reverse_lazy("watagashi_research:home")
68
+
69
+
70
+
71
+ def form_valid(self, form):
72
+
73
+ ctx = {'form': form}
74
+
75
+ if self.request.POST.get('next') == 'confirm':
76
+
77
+ # 更新内容の確認
78
+
79
+ return render(self.request, 'act/update_cnf.html', ctx)
80
+
81
+ elif self.request.POST.get('next') == 'back':
82
+
83
+ # 戻る
84
+
85
+ return render(self.request, 'act/update.html', ctx)
86
+
87
+ elif self.request.POST.get('next') == 'update':
88
+
89
+ # 登録
90
+
91
+ return super().form_valid(form)
92
+
93
+
94
+
95
+
96
+
97
+ 【CustomUserモデルのソース】
98
+
99
+ class CustomUser(AbstractBaseUser, PermissionsMixin):
100
+
101
+ """ ユーザモデル """
102
+
103
+ # ユーザ名
104
+
105
+ username = models.CharField(verbose_name="名前", max_length=50, blank=False)
106
+
107
+ # メールアドレス(ユーザを識別するためのキー)
108
+
109
+ email = models.EmailField(
110
+
111
+ verbose_name="メールアドレス", max_length=255, unique=True, blank=False, null=False)
112
+
113
+ # メルマガ
114
+
115
+ mail_magazine = models.BooleanField(verbose_name="メルマガ", default=True)
116
+
117
+ # 登録日
118
+
119
+ created_at = models.DateField(verbose_name="登録日", auto_now_add=True)
120
+
121
+ # 更新日
122
+
123
+ updated_at = models.DateField(verbose_name="更新日", auto_now=True)
124
+
125
+ # 解約日
126
+
127
+ cancel_at = models.DateField(
128
+
129
+ verbose_name="解約日", default=None, blank=True, null=True)
130
+
131
+ # 会員ランク
132
+
133
+ rank = models.ForeignKey(
134
+
135
+ Rank, on_delete=models.CASCADE, verbose_name='会員ランク', default=1)
136
+
137
+ # 有効フラグ Trueの場合、このアカウントでログイン可能(退会した場合これをFalseにする)
138
+
139
+ is_active = models.BooleanField(verbose_name="アクティブ", default=True)
140
+
141
+ # 管理者フラグ Trueの場合、管理画面にアクセスできる
142
+
143
+ is_staff = models.BooleanField(verbose_name="スタッフ権限", default=False)
144
+
145
+
146
+
147
+ # このFieldのレコードを一意に識別する
148
+
149
+ USERNAME_FIELD = "email"
150
+
151
+ # スーパーユーザ作成時に使用
152
+
153
+ REQUIRED_FIELDS = ["username"]
154
+
155
+
156
+
157
+ objects = UserManager()
158
+
159
+
160
+
161
+ def __str__(self):
162
+
163
+ return self.username
164
+
165
+
166
+
167
+ def get_absolute_url(self):
168
+
169
+ return reverse_lazy('accounts:signup')
170
+
171
+
172
+
173
+
174
+
175
+ 【Rankモデルのソース】
176
+
177
+ class Rank(models.Model):
178
+
179
+ """
180
+
181
+ 会員ランクモデル
182
+
183
+ Rank 1: 無料会員, 2: 有料会員(サブスク), 3: 有料会員(買い切り) 4: 有料会員+オプション有
184
+
185
+ """
186
+
187
+ # ランク
188
+
189
+ rank = models.CharField(verbose_name="ランク", max_length=1, default=1)
190
+
191
+ # ランク名
192
+
193
+ name = models.CharField(verbose_name="ランク名", max_length=50, blank=False)
194
+
195
+ # 登録日
196
+
197
+ created_at = models.DateField(verbose_name="登録日", auto_now_add=True)
198
+
199
+ # 更新日
200
+
201
+ updated_at = models.DateField(verbose_name="更新日", auto_now=True)
202
+
203
+
204
+
205
+ def __str__(self):
206
+
207
+ return self.name
208
+
209
+
210
+
211
+
212
+
213
+ 【UpdateFormフォームのソース】
214
+
215
+ class UpdateForm(forms.ModelForm):
216
+
217
+ class Meta:
218
+
219
+ model = CustomUser
220
+
221
+ fields = ['username', 'email', 'rank']
222
+
223
+
224
+
225
+ def __init__(self, *args, **kwargs):
226
+
227
+ super().__init__(*args, **kwargs)
228
+
229
+ self.fields['username'].widget.attrs['class'] = 'form-control signup-name'
230
+
231
+ self.fields['email'].widget.attrs['class'] = 'form-control signup-email'
232
+
233
+ self.fields['rank'].widget.attrs['class'] = 'form-control signup-email'
234
+
235
+ self.fields['rank'].widget.attrs['disabled'] = 'disabled'
236
+
237
+
238
+
239
+ 【update.htmlのソース】
240
+
241
+ <div class="row g-0 app-auth-wrapper">
242
+
243
+ <div class="d-flex flex-column align-content-end">
244
+
245
+ <div class="app-auth-body mx-auto">
246
+
247
+ <h2 class="auth-heading text-center mb-4">ユーザープロフィール更新</h2>
248
+
249
+ <div class="text-center">以下に必要事項を入力してください。</div>
250
+
251
+ <div class="auth-form-container text-start mx-auto">
252
+
253
+ <form method="POST" class="auth-form auth-signup-form">
254
+
255
+ {% csrf_token %}
256
+
257
+ <div class="email mb-3">
258
+
259
+ <label class="sr-only" for="signup-email">{{ form.username.label }}</label>
260
+
261
+ {{ form.username }}
262
+
263
+ </div>
264
+
265
+ <div class="email mb-3">
266
+
267
+ <label class="sr-only" for="signup-email">{{ form.email.label }}</label>
268
+
269
+ {{ form.email }}
270
+
271
+ </div>
272
+
273
+ <div class="email mb-3">
274
+
275
+ <label class="sr-only" for="signup-email">{{ form.rank.label }}</label>
276
+
277
+ {{ form.rank }}
278
+
279
+ </div>
280
+
281
+ <div class="text-center">
282
+
283
+ <button type="submit" class="btn app-btn-primary w-100 theme-btn mx-auto" name="next" value="confirm">更新内容を確認する</button>
284
+
285
+ </div>
286
+
287
+ </form><!--//auth-form-->
288
+
289
+ </div><!--//auth-form-container-->
290
+
291
+ </div><!--//auth-body-->
292
+
293
+ <footer class="app-auth-footer">
294
+
295
+ <div class="container text-center py-3">
296
+
297
+ <!--/* This template is free as long as you keep the footer attribution link. If you'd like to use the template without the attribution link, you can buy the commercial license via our website: themes.3rdwavemedia.com Thank you for your support. :) */-->
298
+
299
+ <small class="copyright">Designed with <i class="fas fa-heart" style="color: #fb866a;"></i> by <a class="app-link" href="http://themes.3rdwavemedia.com" target="_blank">Xiaoying Riley</a> for developers</small>
300
+
301
+ </div>
302
+
303
+ </footer><!--//app-auth-footer-->
304
+
305
+ </div><!--//flex-column-->
306
+
307
+ </div><!--//row-->
308
+
309
+ ```
310
+
311
+
312
+
313
+ ### 調べたこと・わかったこと
314
+
315
+
316
+
317
+ 会員ランクはselectタグで、Djangoはselectタグをdisabledにしたらpostされない仕組みのようです。
318
+
319
+ なので、form_invalidが発生していると思います。
320
+
321
+
322
+
323
+
324
+
325
+ ### 補足情報(FW/ツールのバージョンなど)
326
+
327
+ asgiref==3.4.1
328
+
329
+ autopep8==1.5.7
330
+
331
+ Django==3.2.8
332
+
333
+ django-localflavor==3.1
334
+
335
+ flake8==4.0.1
336
+
337
+ gunicorn==20.1.0
338
+
339
+ mccabe==0.6.1
340
+
341
+ mysqlclient==2.0.3
342
+
343
+ pycodestyle==2.8.0
344
+
345
+ pyflakes==2.4.0
346
+
347
+ PyMySQL==1.0.2
348
+
349
+ python-stdnum==1.17
350
+
351
+ pytz==2021.3
352
+
353
+ sqlparse==0.4.2
354
+
355
+ toml==0.10.2

1

HTMLタグを追加

2021/11/28 05:41

投稿

atk.on.fukukai
atk.on.fukukai

スコア2

test CHANGED
File without changes
test CHANGED
File without changes