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

質問編集履歴

3

htmlのファイル名を追記

2019/09/11 08:39

投稿

mmmiii
mmmiii

スコア4

title CHANGED
File without changes
body CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
  ```
26
26
 
27
-
27
+ post.html
28
28
  formの選択肢の部分です
29
29
  ```html
30
30
  {% load diary %}

2

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

2019/09/11 08:39

投稿

mmmiii
mmmiii

スコア4

title CHANGED
File without changes
body CHANGED
@@ -47,12 +47,26 @@
47
47
  {% render_books request %}
48
48
  ```
49
49
  これで、呼び出したいQuerySetが呼び出せていることは確認できました。
50
+ <QuerySet [(1, '1234×default'), (2, '5678×default')]>
50
51
 
51
52
 
53
+
52
- ##試したこと
54
+ ##試したこと2
53
55
  ```html
54
56
  {% load diary %}
55
57
 
58
+ <select name="belong" required id="id_belong">
59
+ <option value="1">1234×default</option>
60
+ <option value="2">5678×default</option>
61
+ </select>
62
+ ```
63
+ このようにforを使わずに入力すると、正常に動作することも確認ずみです。
64
+
65
+
66
+ ##試したこと3
67
+ ```html
68
+ {% load diary %}
69
+
56
70
  <select name="belong" required id="id_belong">
57
71
  {% for books in render_books %}
58
72
   <option value="{{ books.0 }}">{{ books.1 }}</option>
@@ -62,6 +76,7 @@
62
76
  requestを外すと、エラーは出ませんが、選択肢が何も表示されません。
63
77
 
64
78
 
79
+
65
80
  ### 補足情報(FW/ツールのバージョンなど)
66
81
 
67
82
  Python 3.7.4

1

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

2019/09/11 08:25

投稿

mmmiii
mmmiii

スコア4

title CHANGED
@@ -1,1 +1,1 @@
1
- djangoのmodelformプルダウン表示する選択肢を、ログイン中のユーザーごと変化させたい
1
+ [django] html、 自分定義したtagforを使って呼びつつ同時requestを引数にしたい
body CHANGED
@@ -1,111 +1,67 @@
1
1
  ### 前提・実現したいこと
2
+ formの選択肢を作る際に、
3
+ djangoでのhtmlで、
2
- djangoのmodelformプルダウンで表示する選択肢を、ログイン中のユーザーごと変化させたい
4
+ 自分定義したtagforを使って呼びつつ同時requestを引数にしたい
3
5
 
4
- 具体的には、下のコードで、DiaryPostFormのbelongの部分の選択肢を、ログイン中のuserが属しているGroupとForeignKeyで結ばれたBookに限定したい。
5
6
 
6
7
 
7
8
  ### 発生している問題・エラーメッセージ
8
- やり方わからずにいす。
9
+ requestと、for同時は使えなようです。
10
+ ```
11
+ TemplateSyntaxError at /diaries/post/
12
+ 'for' statements should use the format 'for x in y': for books in render_books request
13
+ ```
9
14
 
10
15
 
11
16
  ### 該当のソースコード
12
-
13
- model.py
17
+ diary.py
14
18
  ```python
15
- class User(AbstractBaseUser, PermissionsMixin):
16
- email = models.EmailField(_('email address'), unique=True)
17
- first_name = models.CharField(_('first name'), max_length=30, blank=True)
18
- last_name = models.CharField(_('last name'), max_length=150, blank=True)
19
19
 
20
+ @register.simple_tag
21
+ def render_books(request):
22
+ return Book.objects.filter(grouptobook__in =request.user.groups.all()).values_list('id', 'grouptobook__name')
20
23
 
21
- class Book(models.Model)
22
- grouptobook = models.ForeignKey(Group,on_delete=models.PROTECT,verbose_name='グループとbookの関係')
23
- def __str__(self):
24
- return str(self.grouptobook)
25
-
26
24
 
27
- class Diary(models.Model):
28
- title = models.CharField('タイトル', max_length=32, blank=True)
29
- text = models.TextField('本文')
30
- created_at = models.DateTimeField('作成日', default=timezone.now)
31
- creater = models.ForeignKey(User, on_delete=models.PROTECT, verbose_name='投稿者', blank=True)
32
- belong = models.ForeignKey(Book, on_delete=models.PROTECT, verbose_name='bookへの所属')
33
-
34
- def __str__(self):
35
- return self.title
36
-
37
25
  ```
38
26
 
39
- views.py
40
- ```python
41
27
 
28
+ formの選択肢の部分です
29
+ ```html
30
+ {% load diary %}
31
+ <div class="field">
32
+ <label for="id_belong">Bookへの所属:</label>
33
+ <select name="belong" required id="id_belong">
42
- class DiaryPost(generic.CreateView):
34
+ {% for books in render_books request %}
35
+  <option value="{{ books.0 }}">{{ books.1 }}</option>
36
+ {% endfor %}
37
+ </select>
38
+ </div>
39
+
43
40
 
44
- model = Diary
45
- form_class = DiaryPostForm
46
- template_name = 'diaries/post.html'
47
-
48
-
49
-
50
- def form_valid(self, form):
51
- diary = form.save(commit=False)
52
- diary.creater = self.request.user
53
- diary.request = self.request
54
- diary.save()
55
- return redirect('diaries:list')
56
-
57
-
58
- def get_context_data(self, **kwargs):
59
- context = super().get_context_data(**kwargs)
60
- return context
61
41
  ```
62
42
 
63
- forms.py
64
- ```python
65
- class DiaryPostForm(forms.ModelForm):
66
- class Meta:
67
- model = Diary
68
- fields = ('title', 'text', 'belong')
69
- ```
70
43
 
71
- ### 試したこと1
44
+ ##試したこと
72
- https://docs.djangoproject.com/en/dev/ref/forms/fields/#modelchoicefield
73
- 公式ドキュメントを参考に、forms.pyにbelongを上書き?する指示を加えようとしました。
74
-
75
- ```python
45
+ ```html
76
- class DiaryPostForm(forms.ModelForm):
77
- groups = request.user.groups.all()
78
- books = Book.objects.filter(grouptobook__in = groups)
79
- belong = forms.ModelChoiceField(queryset=Diary.objects.filter(belong__in = books)
80
-
81
- class Meta:
82
- model = Diary
46
+ {% load diary %}
83
- fields = ('title', 'text', 'belong')
47
+ {% render_books request %}
84
48
  ```
49
+ これで、呼び出したいQuerySetが呼び出せていることは確認できました。
85
50
 
86
- しかし、requestが使えないようで、
87
- ```
88
- NameError: name 'request' is not defined
89
- ```
90
- というエラーが出ます。
91
51
 
92
- ### 試したこと2
52
+ ##試したこと
93
- requestを使うために、関数を使ってみようとしました。
94
- ```python
53
+ ```html
95
- class DiaryPostForm(forms.ModelForm):
96
- def belong(self):
54
+ {% load diary %}
97
- groups = self.request.user.groups.all()
98
- books = Book.objects.filter(grouptobook__in = groups)
99
- return forms.ModelChoiceField(queryset=Diary.objects.filter(belong__in = books))
100
55
 
101
- class Meta:
102
- model = Diary
103
- fields = ('title', 'text', 'belong')
56
+ <select name="belong" required id="id_belong">
57
+ {% for books in render_books %}
58
+  <option value="{{ books.0 }}">{{ books.1 }}</option>
59
+ {% endfor %}
60
+ </select>
104
61
  ```
62
+ requestを外すと、エラーは出ませんが、選択肢が何も表示されません。
105
63
 
106
- しかし、このままだともちろんなんの変化もなく、関数の反映のさせ方がわかりませんでした。
107
64
 
108
-
109
65
  ### 補足情報(FW/ツールのバージョンなど)
110
66
 
111
67
  Python 3.7.4