質問編集履歴

3

htmlのファイル名を追記

2019/09/11 08:39

投稿

mmmiii
mmmiii

スコア4

test CHANGED
File without changes
test CHANGED
@@ -50,7 +50,7 @@
50
50
 
51
51
 
52
52
 
53
-
53
+ post.html
54
54
 
55
55
  formの選択肢の部分です
56
56
 

2

試したことを追記しました。

2019/09/11 08:39

投稿

mmmiii
mmmiii

スコア4

test CHANGED
File without changes
test CHANGED
@@ -96,11 +96,39 @@
96
96
 
97
97
  これで、呼び出したいQuerySetが呼び出せていることは確認できました。
98
98
 
99
+ <QuerySet [(1, '1234×default'), (2, '5678×default')]>
99
100
 
100
101
 
101
102
 
102
103
 
104
+
105
+
106
+
103
- ##試したこと
107
+ ##試したこと2
108
+
109
+ ```html
110
+
111
+ {% load diary %}
112
+
113
+
114
+
115
+ <select name="belong" required id="id_belong">
116
+
117
+ <option value="1">1234×default</option>
118
+
119
+ <option value="2">5678×default</option>
120
+
121
+ </select>
122
+
123
+ ```
124
+
125
+ このようにforを使わずに入力すると、正常に動作することも確認ずみです。
126
+
127
+
128
+
129
+
130
+
131
+ ##試したこと3
104
132
 
105
133
  ```html
106
134
 
@@ -126,6 +154,8 @@
126
154
 
127
155
 
128
156
 
157
+
158
+
129
159
  ### 補足情報(FW/ツールのバージョンなど)
130
160
 
131
161
 

1

どこに問題があるかわかったので、より具体的に書きました。

2019/09/11 08:25

投稿

mmmiii
mmmiii

スコア4

test CHANGED
@@ -1 +1 @@
1
- djangomodelformでプルダウンで表示する選択肢を、ログイン中のユーザーごと変化させたい
1
+ [django] htmlで、 自分で定義したtagをforを使って呼びつつ同時requestを引数にしたい
test CHANGED
@@ -1,10 +1,12 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
+ formの選択肢を作る際に、
4
+
5
+ djangoでのhtmlで、
6
+
3
- djangoのmodelformでプルダウンで表示する選択肢を、ログイン中のユーザーごと変化させたい
7
+ 自分で定義したtagforを使って呼びつつ同時requestを引数にしたい
4
8
 
5
9
 
6
-
7
- 具体的には、下のコードで、DiaryPostFormのbelongの部分の選択肢を、ログイン中のuserが属しているGroupとForeignKeyで結ばれたBookに限定したい。
8
10
 
9
11
 
10
12
 
@@ -12,7 +14,15 @@
12
14
 
13
15
  ### 発生している問題・エラーメッセージ
14
16
 
15
- やり方わからずにいす。
17
+ requestと、for同時は使えなようです。
18
+
19
+ ```
20
+
21
+ TemplateSyntaxError at /diaries/post/
22
+
23
+ 'for' statements should use the format 'for x in y': for books in render_books request
24
+
25
+ ```
16
26
 
17
27
 
18
28
 
@@ -20,53 +30,19 @@
20
30
 
21
31
  ### 該当のソースコード
22
32
 
23
-
24
-
25
- model.py
33
+ diary.py
26
34
 
27
35
  ```python
28
36
 
29
- class User(AbstractBaseUser, PermissionsMixin):
30
-
31
- email = models.EmailField(_('email address'), unique=True)
32
-
33
- first_name = models.CharField(_('first name'), max_length=30, blank=True)
34
-
35
- last_name = models.CharField(_('last name'), max_length=150, blank=True)
36
37
 
37
38
 
39
+ @register.simple_tag
40
+
41
+ def render_books(request):
42
+
43
+ return Book.objects.filter(grouptobook__in =request.user.groups.all()).values_list('id', 'grouptobook__name')
38
44
 
39
45
 
40
-
41
- class Book(models.Model)
42
-
43
- grouptobook = models.ForeignKey(Group,on_delete=models.PROTECT,verbose_name='グループとbookの関係')
44
-
45
- def __str__(self):
46
-
47
- return str(self.grouptobook)
48
-
49
-
50
-
51
-
52
-
53
- class Diary(models.Model):
54
-
55
- title = models.CharField('タイトル', max_length=32, blank=True)
56
-
57
- text = models.TextField('本文')
58
-
59
- created_at = models.DateTimeField('作成日', default=timezone.now)
60
-
61
- creater = models.ForeignKey(User, on_delete=models.PROTECT, verbose_name='投稿者', blank=True)
62
-
63
- belong = models.ForeignKey(Book, on_delete=models.PROTECT, verbose_name='bookへの所属')
64
-
65
-
66
-
67
- def __str__(self):
68
-
69
- return self.title
70
46
 
71
47
 
72
48
 
@@ -74,141 +50,77 @@
74
50
 
75
51
 
76
52
 
77
- views.py
78
53
 
54
+
55
+ formの選択肢の部分です
56
+
79
- ```python
57
+ ```html
58
+
59
+ {% load diary %}
60
+
61
+ <div class="field">
62
+
63
+ <label for="id_belong">Bookへの所属:</label>
64
+
65
+ <select name="belong" required id="id_belong">
66
+
67
+ {% for books in render_books request %}
68
+
69
+  <option value="{{ books.0 }}">{{ books.1 }}</option>
70
+
71
+ {% endfor %}
72
+
73
+ </select>
74
+
75
+ </div>
76
+
77
+
80
78
 
81
79
 
82
80
 
83
- class DiaryPost(generic.CreateView):
84
-
85
-
86
-
87
- model = Diary
88
-
89
- form_class = DiaryPostForm
90
-
91
- template_name = 'diaries/post.html'
92
-
93
-
94
-
95
-
96
-
97
-
98
-
99
- def form_valid(self, form):
100
-
101
- diary = form.save(commit=False)
102
-
103
- diary.creater = self.request.user
104
-
105
- diary.request = self.request
106
-
107
- diary.save()
81
+ ```
108
-
109
- return redirect('diaries:list')
110
82
 
111
83
 
112
84
 
113
85
 
114
86
 
115
- def get_context_data(self, **kwargs):
87
+ ##試したこと1
116
88
 
117
- context = super().get_context_data(**kwargs)
89
+ ```html
118
90
 
119
- return context
91
+ {% load diary %}
92
+
93
+ {% render_books request %}
120
94
 
121
95
  ```
122
96
 
97
+ これで、呼び出したいQuerySetが呼び出せていることは確認できました。
123
98
 
124
99
 
125
- forms.py
126
100
 
127
- ```python
128
101
 
129
- class DiaryPostForm(forms.ModelForm):
130
102
 
131
- class Meta:
103
+ ##試したこと2
132
104
 
133
- model = Diary
105
+ ```html
134
106
 
107
+ {% load diary %}
108
+
109
+
110
+
135
- fields = ('title', 'text', 'belong')
111
+ <select name="belong" required id="id_belong">
112
+
113
+ {% for books in render_books %}
114
+
115
+  <option value="{{ books.0 }}">{{ books.1 }}</option>
116
+
117
+ {% endfor %}
118
+
119
+ </select>
136
120
 
137
121
  ```
138
122
 
139
-
140
-
141
- ### 試したこと1
142
-
143
- https://docs.djangoproject.com/en/dev/ref/forms/fields/#modelchoicefield
144
-
145
- 公式ドキュメントを参考に、forms.pyにbelongを上書き?する指示を加えようとしました。
146
-
147
-
148
-
149
- ```python
150
-
151
- class DiaryPostForm(forms.ModelForm):
152
-
153
- groups = request.user.groups.all()
154
-
155
- books = Book.objects.filter(grouptobook__in = groups)
156
-
157
- belong = forms.ModelChoiceField(queryset=Diary.objects.filter(belong__in = books)
158
-
159
-
160
-
161
- class Meta:
162
-
163
- model = Diary
164
-
165
- fields = ('title', 'text', 'belong')
166
-
167
- ```
168
-
169
-
170
-
171
- しかし、requestが使えないようで、
172
-
173
- ```
174
-
175
- NameError: name 'request' is not defined
176
-
177
- ```
178
-
179
- というエラーが出ます。
180
-
181
-
182
-
183
- ### 試したこと2
184
-
185
- requestを使うために関数を使ってみようとしした
123
+ requestを外すとエラーは出せんが、選択肢が何も表示されません
186
-
187
- ```python
188
-
189
- class DiaryPostForm(forms.ModelForm):
190
-
191
- def belong(self):
192
-
193
- groups = self.request.user.groups.all()
194
-
195
- books = Book.objects.filter(grouptobook__in = groups)
196
-
197
- return forms.ModelChoiceField(queryset=Diary.objects.filter(belong__in = books))
198
-
199
-
200
-
201
- class Meta:
202
-
203
- model = Diary
204
-
205
- fields = ('title', 'text', 'belong')
206
-
207
- ```
208
-
209
-
210
-
211
- しかし、このままだともちろんなんの変化もなく、関数の反映のさせ方がわかりませんでした。
212
124
 
213
125
 
214
126