Начальное значение Django ModelForm ManyToManyField

Я использую Django 1.11.2 для разработки веб-сайта. Я использую ModelForms для редактирования экземпляров модели на своем веб-сайте. Каждое поле формы получает подходящее значение экземпляра, который я хочу отредактировать, через «начальный» в моем представлении. Он отлично работает для всех полей, кроме ManyToManyFields.

Соответствующий код выглядит так:

модели.ру:

class model1(models.Model):
    name = models.CharField(max_length=45, blank=False, null=False)

class model2(models.Model):
    name = models.CharField(max_length=45, blank=False, null=False)
    relation = models.ManyToManyField(model1)

МодельФорма в forms.py:

class model2_form(forms.ModelForm):
    class Meta:
        model = model2
        fields = '__all__'

и представление, которое я использую для редактирования экземпляров модели2:

def model2_edit(request, objectid):
    link = 'Model2'
    model2_inst = model2.objects.get(id=objectid)
    form = model2_form(initial={'name': model2_inst.name,
                                'relation': ???})
    if request.method == 'POST':
        f = model2_form(request.POST, instance=model2_inst)
        if f.is_valid():
            f.save()
            return HttpResponseRedirect('/model2')
    return render(request, "edit_db.html",
                  {"form": form, "link":link})

Каждый раз, когда я редактирую экземпляр model2 через ModelForm, «отношения» экземпляра, которые уже существуют, не выбираются заранее («исходный» не работает). Если я сохраню такую ​​форму без повторного выбора отношений, они будут удалены, и этот экземпляр model2 больше не будет иметь отношений. На месте '???' в моем коде я пробовал много способов получить эти отношения, уже выбранные в форме, но я не мог найти рабочий способ.

Надеюсь, мне удалось описать свою проблему, заранее спасибо за любую помощь или идеи.


person Nkls155    schedule 03.08.2017    source источник


Ответы (2)


Вы должны предоставить instance для запросов GET и POST. Таким образом, вам не нужно предоставлять initial данные — Django автоматически получит значения из экземпляра.

model2_inst = model2.objects.get(id=objectid)
form = model2_form(instance=model2_inst)
person Alasdair    schedule 03.08.2017
comment
Спасибо, так даже проще. - person Nkls155; 03.08.2017

person    schedule
comment
Большое спасибо, я думал, что попробовал это, я, должно быть, ошибся. Теперь он работает нормально. - person Nkls155; 03.08.2017