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

質問編集履歴

4

2017/09/15 13:45

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
File without changes

3

補足の追記

2017/09/15 13:45

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -84,5 +84,30 @@
84
84
  上記のコードを編集し直しました。
85
85
  しかしリダイレクト先は、form_invalidの方になってしまいます。
86
86
  forms.pyのclean_passwordが上手く動作していないようですが、DBに保存された既存のpasswordといかに照合すればよいでしょうか。
87
+ 改めてご教示のほど宜しくお願い致します。
87
88
 
89
+ ###補足
90
+ ちなみにですがforms.pyを
91
+ ```
92
+ #forms.py
93
+
94
+ class PraForm(forms.ModelForm):
95
+ class Meta:
96
+ model = practice
97
+ fields = ('text1','password')
98
+
99
+ def __init__(self, *args, **kwargs):
100
+ practice_id = kwargs.pop('practice_id')
101
+ super(PraForm, self).__init__(*args, **kwargs)
102
+
103
+ def clean_password(self):
104
+ password = self.cleaned_data['password']
105
+ aaa = practice.objects.get(id = practice_id)
106
+ if password != aaa.password:
107
+ raise forms.ValidationError('パスワードが違います')
108
+ return password
109
+ ```
110
+ のように書くと
111
+ ERROR:name 'practice_id' is not defined
88
- 改めてご教示ほど宜くお願します。
112
+ ように出てますが、このエラーの解決が答えにつながる気もております。
113
+ 上の方で書いたforms.pyはnot definedが出ていたので__init__の中に入れてみたという挑戦の軌跡となっております。

2

コード更新

2017/09/15 11:54

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -19,16 +19,19 @@
19
19
  model = practice
20
20
  fields = ('text1','password')
21
21
 
22
+ def __init__(self, *args, **kwargs):
23
+ practice_id = kwargs.pop('practice_id')
24
+ super(PraForm, self).__init__(*args, **kwargs)
25
+
22
- def clean_password(self):
26
+ def clean_password(self):
23
- password = self.cleaned_data['password']
27
+ password = self.cleaned_data['password']
24
- aaa = practice.objects.get(id = id)
28
+ aaa = practice.objects.get(id = practice_id)
25
- bbb = aaa.password
26
- if password != bbb:
29
+ if password != aaa.password:
27
- raise forms.ValidationError('パスワードが違います')
30
+ raise forms.ValidationError('パスワードが違います')
28
- return password
31
+ return password
29
32
  ```
30
33
  ここの仕組み作りは下記点において苦しんでおります。。。
31
- ・CBV→modelformへのID(pk)の渡し方
34
+ ・CBV→modelformへのID(pk)の渡し方 ※解決しました。
32
35
  ・idに紐づいたパスワードとの照合方法
33
36
  入力されたpasswordとDBから引っ張ってきたpasswordがマッチすれば
34
37
  form_validになるというイメージです。
@@ -36,14 +39,18 @@
36
39
  ```
37
40
  #views.py
38
41
 
42
+ def top(request):
43
+ return render(request, 'top.html')
44
+
39
45
  class DataView(FormMixin, generic.DetailView):
40
46
  model = practice
41
47
  form_class = PraForm
42
48
  template_name = 'practice_detail.html'
43
49
 
44
- def form_valid(self, form):
50
+ def get_form_kwargs(self):
51
+ kwargs = super(DataView, self).get_form_kwargs()
45
- practice_pk = self.kwargs['pk']
52
+ kwargs['practice_id'] = self.kwargs['pk']
46
- return redirect('pra1:dataview', pk=practice_pk)
53
+ return kwargs
47
54
 
48
55
  def post(self, request, *args, **kwargs):
49
56
  form = self.get_form()
@@ -51,118 +58,31 @@
51
58
  return self.form_valid(form)
52
59
  else:
53
60
  return self.form_invalid(form)
61
+
62
+ def form_valid(self, form):
63
+ practice_pk = self.kwargs['pk']
64
+ return redirect('pra1:dataview', pk=practice_pk)
65
+
66
+ def form_invalid(self, form):
67
+ return redirect('pra1:top')
54
68
  ```
55
69
  先ほどのformの照合で、form_validになればリダイレクト先の編集ページに飛ばそうと思っております。(このコードは自身へのリダイレクトになっております。)
56
70
 
57
71
 
58
72
  ###発生している問題・エラーメッセージ
59
- こちらのコードが一番イメージに近いのかなと思っておりますが、
60
- 下記のエラーが出力されます。
73
+ ※このエラーは解決したので削除します。
61
74
 
62
- ```
63
- int() argument must be a string, a bytes-like object or a number, not 'builtin_function_or_method'
64
75
 
65
- Environment:
66
-
67
-
68
- Request Method: POST
69
- Request URL: http://127.0.0.1:8000/pra1/dataview/1/
70
-
71
- Django Version: 1.11.5
72
- Python Version: 3.6.0
73
- Installed Applications:
74
- ['django.contrib.admin',
75
- 'django.contrib.auth',
76
- 'django.contrib.contenttypes',
77
- 'django.contrib.sessions',
78
- 'django.contrib.messages',
79
- 'django.contrib.staticfiles',
80
- 'pra1',
81
- 'pra2']
82
- Installed Middleware:
83
- ['django.middleware.security.SecurityMiddleware',
84
- 'django.contrib.sessions.middleware.SessionMiddleware',
85
- 'django.middleware.common.CommonMiddleware',
86
- 'django.middleware.csrf.CsrfViewMiddleware',
87
- 'django.contrib.auth.middleware.AuthenticationMiddleware',
88
- 'django.contrib.messages.middleware.MessageMiddleware',
89
- 'django.middleware.clickjacking.XFrameOptionsMiddleware']
90
-
91
-
92
-
93
- Traceback:
94
-
95
- File "C:\Users\User\pra\pra\pra\lib\site-packages\django\core\handlers\exception.py" in inner
96
- 41. response = get_response(request)
97
-
98
- File "C:\Users\User\pra\pra\pra\lib\site-packages\django\core\handlers\base.py" in _get_response
99
- 187. response = self.process_exception_by_middleware(e, request)
100
-
101
- File "C:\Users\User\pra\pra\pra\lib\site-packages\django\core\handlers\base.py" in _get_response
102
- 185. response = wrapped_callback(request, *callback_args, **callback_kwargs)
103
-
104
- File "C:\Users\User\pra\pra\pra\lib\site-packages\django\views\generic\base.py" in view
105
- 68. return self.dispatch(request, *args, **kwargs)
106
-
107
- File "C:\Users\User\pra\pra\pra\lib\site-packages\django\views\generic\base.py" in dispatch
108
- 88. return handler(request, *args, **kwargs)
109
-
110
- File "C:\Users\User\pra\pra\pra\mysite\pra1\views.py" in post
111
- 26. if form.is_valid():
112
-
113
- File "C:\Users\User\pra\pra\pra\lib\site-packages\django\forms\forms.py" in is_valid
114
- 183. return self.is_bound and not self.errors
115
-
116
- File "C:\Users\User\pra\pra\pra\lib\site-packages\django\forms\forms.py" in errors
117
- 175. self.full_clean()
118
-
119
- File "C:\Users\User\pra\pra\pra\lib\site-packages\django\forms\forms.py" in full_clean
120
- 384. self._clean_fields()
121
-
122
- File "C:\Users\User\pra\pra\pra\lib\site-packages\django\forms\forms.py" in _clean_fields
123
- 405. value = getattr(self, 'clean_%s' % name)()
124
-
125
- File "C:\Users\User\pra\pra\pra\mysite\pra1\forms.py" in clean_password
126
- 12. aaa = practice.objects.get(id = id)
127
-
128
- File "C:\Users\User\pra\pra\pra\lib\site-packages\django\db\models\manager.py" in manager_method
129
- 85. return getattr(self.get_queryset(), name)(*args, **kwargs)
130
-
131
- File "C:\Users\User\pra\pra\pra\lib\site-packages\django\db\models\query.py" in get
132
- 371. clone = self.filter(*args, **kwargs)
133
-
134
- File "C:\Users\User\pra\pra\pra\lib\site-packages\django\db\models\query.py" in filter
135
- 784. return self._filter_or_exclude(False, *args, **kwargs)
136
-
137
- File "C:\Users\User\pra\pra\pra\lib\site-packages\django\db\models\query.py" in _filter_or_exclude
138
- 802. clone.query.add_q(Q(*args, **kwargs))
139
-
140
- File "C:\Users\User\pra\pra\pra\lib\site-packages\django\db\models\sql\query.py" in add_q
141
- 1250. clause, _ = self._add_q(q_object, self.used_aliases)
142
-
143
- File "C:\Users\User\pra\pra\pra\lib\site-packages\django\db\models\sql\query.py" in _add_q
144
- 1276. allow_joins=allow_joins, split_subq=split_subq,
145
-
146
- File "C:\Users\User\pra\pra\pra\lib\site-packages\django\db\models\sql\query.py" in build_filter
147
- 1210. condition = self.build_lookup(lookups, col, value)
148
-
149
- File "C:\Users\User\pra\pra\pra\lib\site-packages\django\db\models\sql\query.py" in build_lookup
150
- 1104. return final_lookup(lhs, rhs)
151
-
152
- File "C:\Users\User\pra\pra\pra\lib\site-packages\django\db\models\lookups.py" in __init__
153
- 24. self.rhs = self.get_prep_lookup()
154
-
155
- File "C:\Users\User\pra\pra\pra\lib\site-packages\django\db\models\lookups.py" in get_prep_lookup
156
- 74. return self.lhs.output_field.get_prep_value(self.rhs)
157
-
158
- File "C:\Users\User\pra\pra\pra\lib\site-packages\django\db\models\fields\__init__.py" in get_prep_value
159
- 966. return int(value)
160
-
161
- Exception Type: TypeError at /pra1/dataview/1/
162
- Exception Value: int() argument must be a string, a bytes-like object or a number, not 'builtin_function_or_method'
163
- ```
164
76
  恐らくforms.pyのid = idの部分が問題なのだろうと思います。
165
77
 
166
78
  如何にして、formにparameterを渡していくか、
167
79
  そしてその先のvalidationに関してもコードのご教示を頂ければ幸いです。
168
- 宜しくお願い致します。
80
+ 宜しくお願い致します。
81
+
82
+ ###追記
83
+ パラメーターのpassにはどうやら成功したようです。
84
+ 上記のコードを編集し直しました。
85
+ しかしリダイレクト先は、form_invalidの方になってしまいます。
86
+ forms.pyのclean_passwordが上手く動作していないようですが、DBに保存された既存のpasswordといかに照合すればよいでしょうか。
87
+
88
+ 改めてご教示のほど宜しくお願い致します。

1

2017/09/15 11:15

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -165,4 +165,4 @@
165
165
 
166
166
  如何にして、formにparameterを渡していくか、
167
167
  そしてその先のvalidationに関してもコードのご教示を頂ければ幸いです。
168
- よろしくお願いいたします。
168
+ しくお願いします。