разделение ManyToManyField на несколько полей формы в ModelForm

StackOverflow https://stackoverflow.com/questions/654576

Вопрос

Итак, у меня есть модель с ManyToManyField, которая называется турниром. У меня есть ModelForm с двумя полями турнира:

pay_tourns = forms.ModelMultipleChoiceField(
                        queryset=Tourn.objects.all().active().pay_tourns(),
                        widget=forms.CheckboxSelectMultiple())
rep_tourns = forms.ModelMultipleChoiceField(
                        queryset=Tourn.objects.all().active().rep_tourns(),
                        widget=forms.CheckboxSelectMultiple())

Методы ведь () существуют из подкласса QuerySet. Когда я сохраняю форму в моем представлении, я делаю так:

post.tournaments = (post_form.cleaned_data.get('pay_tourns')
                                + post_form.cleaned_data.get('rep_tourns'))

В любом случае, все это прекрасно работает. Что я не могу понять, как это сделать, это заполнить эти поля формы при загрузке существующего сообщения. То есть когда я передаю instance = post в форму. Есть идеи?

Это было полезно?

Решение 2

Паоло Бергантино был на правильном пути и помог мне найти его. Это было решение:

def __init__(self, *args, **kwargs):
    super(MyForm, self).__init__(*args, **kwargs)

    instance = kwargs.get('instance')
    if instance:
        self.fields['pay_tourns'].initial = [ o.id for o in instance.tournaments.all().active().pay_tourns()]
        self.fields['rep_tourns'].initial = [ o.id for o in instance.tournaments.all().active().rep_tourns()]

Другие советы

Вы можете сделать что-то подобное с ModelForm:

def __init__(self, *args, **kwargs):
    super(MyForm, self).__init__(*args, **kwargs)

    instance = kwargs.get('instance')
    if instance:
        self.fields['pay_tourns'].queryset.filter(post=instance)
        self.fields['rep_tourns'].queryset.filter(post=instance)

Я не понимаю, почему это не сработает, но я собираюсь проверить это, просто чтобы убедиться ...

РЕДАКТИРОВАТЬ: протестировано, и оно работает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top