この質問に非常に似ていますが、受け入れられた回答を試しましたが、うまくいきませんでした。これが何が起こっているかです。
次のような写真の人にタグを付けるためのフォームがあります。
フォーム.py
class TaggingForm(forms.Form):
def __init__(self, *args, **kwargs):
queryset = kwargs.pop('queryset')
super(TaggingForm, self).__init__(*args, **kwargs)
self.fields['people'] = forms.ModelMultipleChoiceField(required=False, queryset=queryset, widget=forms.CheckboxSelectMultiple)
...
models.py
class Photo(models.Model):
user = models.ForeignKey(User)
...
class Person(models.Model):
user = models.ForeignKey(User)
photos = models.ManyToManyField(Photo)
...
ユーザーが最初にタグを付けた後、写真のタグを編集できるようにしたいので、1 枚の写真を表示してそのタグを編集できるページを用意しました。明らかな理由から、既にタグ付けされた個人のチェックボックスを事前に選択したいと考えています。上記でリンクした質問への回答のように、フォームの最初の辞書に選択したい人のリストを与えることで、これを実行しようとしました。
ビュー.py
def photo_detail(request,photo_id):
photo = Photo.objects.get(id=photo_id)
initial = {'photo_id':photo.id, 'people':[p for p in photo.person_set.all()]}
form_queryset = Person.objects.filter(user=request.user)
if request.method == "POST":
form = TaggingForm(request.POST, queryset=form_queryset)
# do stuff
else:
form = TaggingForm(initial=initial, queryset=form_queryset)
...
上記のコードのように人を初期化しようとすると、フォームは表示されませんが、エラーもスローされません。初期ディクショナリから「people」のキーと値のペアを取り出すと、フォームは正常に表示されますが、人物はチェックされません。また、問題があれば Django 1.5 を使用しています。前もって感謝します。