質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Q&A

解決済

1回答

2501閲覧

Django:ラジオボタンの初期状態が指定できない

save6

総合スコア6

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

0グッド

0クリップ

投稿2021/11/01 08:14

前提・実現したいこと

ラジオボタンの初期状態をデータベースに保存されているデータ通りにしたいです。

発生している問題・エラーメッセージ

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

すみません、自己解決しました。

ラジオボタンが全て同じname属性になっているために一つのラジオボタンとしてセットされていました。
下記のようにformで囲んで別物としたことで解決しました。
お時間いただいた方ありがとうございました。

html

1<div>村への受け入れ</div> 2 {% if village_mayor_data.approval_form %} 3 <form> 4 {% for field in village_mayor_data.approval_form %} 5 <div>{{ field }}</div> 6 {% endfor %} 7 </form> 8 {% endif %}

投稿2021/11/01 12:14

save6

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問