行き詰りました。
最初のプルダウンメニューで選択した項目を
次のプルダウンメニューに連動させたいです。
(admin管理サイトは使用しない)
Django
1#model.py 2 3class Create_type(models.Model): 4 name = models.CharField(max_length=20,unique=True) 5 def __str__(self): 6 return self.name 7 8class Genre(models.Model): 9 name = models.CharField(max_length=20,unique=True) 10 create_type = models.ManyToManyField(Create_type) 11 def __str__(self): 12 return self.name 13 14class Title_Post(models.Model): 15 title = models.CharField(unique=True) 16 create_type = models.ForeignKey(Create_type,blank=false) 17 genre = models.ManyToManyField(Genre,blank=True) 18
以下のサイトを参考にForm.pyを作成しました。
https://stackoverflow.com/questions/291945/how-do-i-filter-foreignkey-choices-in-a-django-modelform
Django
1#form.py 2 3class Title_Form(forms.ModelForm): 4 class Meta: 5 model = Title_Post 6 fields = ('title','create_type','genre') 7 8 def __init__(self, *args, **kwargs): 9 super(Title_Form, self).__init__(*args, **kwargs) 10 self.fields['genre'].queryset = Genre.objects.filter( 11 type=self.instance.type) 12
Django
1#view.py 2def title_new(request): 3 if request.method == "POST": 4 f = Title_Form(request.POST,request.FILES) 5 if f.is_valid(): 6 post = f.save(commit=False) 7 post.published_date = timezone.now() 8 post.save() 9 f.save_m2m() 10 return redirect('app:title', pk=post.pk) 11 else: 12 f = Title_Form() 13 return render(request, 'app/title_edit.html', {'form':f})
小説 | 映画 | アニメ |
---|---|---|
SF | SF | SF |
ホラー | ホラー | ホラー |
3D | 3D |
イメージ的には
Type(小説、映画、アニメ)があって、
Genre(SF、ホラー、3D)等のジャンルがあり、
フォーム上で小説を選択した場合、genreのリストでは「3D」を選択できないようにしたいです。
表示しないという動作はJavascriptで記述できたのですが、Javascriptを無効にした場合、不正な入力がされてしまうと思うので、Django側のModelやFormで入力をエラーとしたいです。
現状は、そもそもGenreに値が表示されません・・・
何卒、よろしくお願いいたします・・
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/30 04:41
2018/03/30 16:49
2018/04/03 00:02
2018/04/03 13:43 編集
2018/04/03 13:53
2018/04/03 13:58