前提・実現したいこと
ラジオボタンの初期状態をデータベースに保存されているデータ通りにしたいです。
発生している問題・エラーメッセージ
1ページに複数ラジオボタンがあるのですが、データベースの状態を引き継いで正しく表示されているのが最後のラジオボタンのみで、他のラジオボタンは未選択状態になってしまいます。
ラジオボタンはfor文で繰り返し生成しているので最後のものだけ正しく表示されているのがよく分からず困っています。
お手数おかけし申し訳ございませんが、ご助言いただけますと幸いです。
該当の
views.pyは以下の通りで★★★が付いているとこが該当箇所です。
python
1class UserHouseView_Village(TemplateView): 2 3 def get(self,request,house_id): 4 url = LoginCheck.getRedirectURL(request) 5 if url != "": 6 return redirect(to=url) 7 8 if not House.objects.filter(url=house_id,user_id=request.user).exists() : 9 return redirect(to='/') 10 11 #所属している村のデータを取得 12 belong_village = Village.objects.filter(user_id=request.user) 13 14 form = VillageBelongForm() 15 16 #所属リクエストのコメントを設定 17 request_villages = Village_request.objects.filter(request_user=request.user) 18 belong_msgs = [] 19 if request_villages.exists(): 20 for request_village in request_villages: 21 #未承認 22 if request_village.status == 0: 23 belong_msgs.extend([{'text':request_village.village_id.name + '村の村長に村人になりたいとリクエストを送信しました。','tags':''}, 24 {'text':'村長の承認待ちです。','tags':''}]) 25 #承認済み 26 if request_village.status == 1: 27 belong_msgs.extend([{'text':request_village.village_id.name + '村の村長に承認されました。' + request_village.village_id.name + '村に所属できました。','tags':''}]) 28 #棄却 29 if request_village.status == 2 or request_village.status == 3: 30 belong_msgs.extend([{'text':request_village.village_id.name + '村の村長に承認されませんでした。' + request_village.village_id.name + '村には所属できませんでした。','tags':''}]) 31 32 village_mayor_datas = [] 33 village_mayor_objs = Village.objects.filter(creator_id=request.user) 34 35 if village_mayor_objs.exists(): 36 for village_mayor_obj in village_mayor_objs: 37 #村の情報を取得 38 village_infoes = Village_info.objects.filter(village_id=village_mayor_obj).order_by('creation_date').reverse() 39 40 #ページネーションの設定 41 page = Paginator(village_infoes,5) 42 43 #村人の人数を取得 44 villager_count = village_mayor_obj.user_id.count 45 46 #★★★ここです!受け入れタイプのフォームを取得★★★ 47 approval_form = ApprovalTypeForm(instance=village_mayor_obj) 48 49 #承認が必要なリクエストを取得 50 approval_msgs = [] 51 approval_requests = Village_request.objects.filter(village_id=village_mayor_obj,status=0) 52 if approval_requests.exists(): 53 for approval_request in approval_requests: 54 approval_msgs.append({'user':approval_request.request_user.username,'text': "さんから村に入りたいとリクエストが来ています。"}) 55 56 village_mayor_datas.append({'obj':village_mayor_obj,'villager_count':villager_count,'info':page.get_page(1),'approve':approval_msgs,'approval_form':approval_form}) 57 58 recommended = "" 59 village_data = "" 60 61 params = { 62 'village_data':village_data, 63 'recommended':recommended, 64 'house_id':house_id, 65 'belong_data':belong_village, 66 'belong_form':form, 67 'belong_messages':belong_msgs, 68 'village_mayor_datas':village_mayor_datas, 69 } 70 return render(request, 'Rooms_app/village.html', params)
forms.pyは以下の通りです
python
1class ApprovalTypeForm(ModelForm): 2 3 DATA = [ 4 ('0', '自動承認'), 5 ('1', '手動承認'), 6 ('2', '全て拒否') 7 ] 8 accept_type = forms.ChoiceField(label="", choices=DATA, widget=forms.RadioSelect) 9 10 class Meta: 11 model = Village 12 fields = ['accept_type']
models.pyは以下の通りです。
python
1APPROVAL_TYPE = [ 2 ('0', '自動承認'), 3 ('1', '手動承認'), 4 ('2', '全て拒否'), 5] 6 7class Village(models.Model): 8 user_id = models.ManyToManyField('Members_app.Member', blank=True,verbose_name='user_id',related_name='user_id') 9 creator_id = models.ForeignKey('Members_app.Member', on_delete=models.CASCADE,verbose_name='creator_id',related_name='creator_id') 10 name = models.CharField(max_length=100,unique=True) 11 picture = models.ImageField(default='upload/noimage_gray.jpg',upload_to='upload/%Y/%m/%d/',verbose_name='ルーム画像',validators=[FileExtensionValidator(['jpg','jpeg','png','gif'])]) 12 url = models.CharField(max_length=101,unique=True) 13 content = models.CharField(max_length=500,blank=True,null=True) 14 event = models.ImageField(blank=True,null=True,upload_to='upload/%Y/%m/%d/',verbose_name='イベント用画像',validators=[FileExtensionValidator(['jpg','jpeg','png','gif'])]) 15 rule = models.CharField(max_length=1000,blank=True,null=True) 16 chat_type = models.IntegerField(default=2) 17 chat_picture = models.ImageField(blank=True,null=True,upload_to='upload/%Y/%m/%d/',verbose_name='チャット用背景画像',validators=[FileExtensionValidator(['jpg','jpeg','png','gif'])]) 18 #★★★これが該当の項目です★★★ 19 accept_type = models.CharField(default='0',choices=APPROVAL_TYPE,max_length=1) 20 creation_date = models.DateTimeField(auto_now_add=True) 21 22 def __str__(self): 23 return '<村名:' + self.name + '>'
テンプレートは以下の通りです。
html
1<div>村への受け入れ</div> 2 {% if village_mayor_data.approval_form %} 3 {% for field in village_mayor_data.approval_form %} 4 <div>{{ field }}</div> 5 {% endfor %} 6 {% endif %} 7
試したこと
色々ネットで調べましたが同じような事象にあった方はいないようでした。
formをModelFormで作ってinstanceでデータを渡していますが、これがダメなのかと思って、
formをform.Formで作ってinitialでデータを渡してみましたが、同じように最後のラジオボタンのみ値が入っている状態になりました。
python
1#受け入れタイプのフォームを取得 2 initial_data = {'accept_type':village_mayor_obj.accept_type} 3 approval_form = ApprovalTypeForm(None, initial=initial_data)
最後のラジオボタンだけ値が2で他は0か1だったので、2のときだけ反応するのかと思い、表示されない他の値のDBの値を2に変更してみたのですが、変わらず表示されませんでした。
試しにformのコードを下記のように変えmodelのデータをそのまま表示するように変えたら全てのデータが表示されました。そのため、viewsでfor文でinstanceを設定しているところは間違えていないのでは?と思っているのですが、今の状況でなぜ最後のラジオボタンのみが表示されるのか分からず、お手数おかけし申し訳ございませんが、お助けいただけると幸いです。
python
1class ApprovalTypeForm(forms.ModelForm): 2 3 class Meta: 4 model = Village 5 fields = ['accept_type']
補足情報(FW/ツールのバージョンなど)
django:3.0.4
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。