Подстановка отсутствующего значения поля при сохранении формы модели - PullRequest
7 голосов
/ 06 июня 2009

У меня есть эта модель:

class Fleet(models.Model):
    company     =   models.ForeignKey("Company", editable=False)
    aircraft    =   models.ForeignKey("Aircraft")
    size        =   models.IntegerField(default=1)
    description =   models.TextField(blank=True)

    def __unicode__(self):
        return u"%s" % (self.aircraft, )

А затем форма, основанная на этой модели:

class FleetForm(ModelForm):
    class Meta:
        model = Fleet
        exclude = ('company', )

Когда я использую эту форму в шаблоне, поле «компания» не добавляется, что ожидается. Но это поле обязательно для заполнения! = True.

Как я использую эту форму, атрибут компании всегда будет известен в функции представления, так как он передается из URL. Как добавить компанию в форму в функции просмотра перед ее сохранением?

Вот мой взгляд:

def new_fleet(request, company_id):
    from forms import FleetForm

    company = Company.objects.get(pk=company_id)

    if request.method == "POST":
        form = FleetForm(request.POST,)

        form.company = company            #doesn't work

        form = form.save(commit=False)    #can't do this because the form 
        form.company = company            #doesn't validate (company is not set)

        if not form.errors:
            form.save()

    else:
        fleet = Fleet(company=company)    #pointless because the company widget
        form = FleetForm(instance=fleet)  #isn't created but eh whatever

Ответы [ 2 ]

9 голосов
/ 06 июня 2009

Существует два способа решения этой проблемы:

Создайте экземпляр вашей модели с начальными значениями для пропущенных, но обязательных полей:

company = Company.objects.get(pk=company_id)
fleet = Fleet(company=company)
form = FleetForm(request.POST, instance=fleet)
new_fleet = form.save()

Используйте save(commit=False) и вручную установите дополнительные поля:

company = Company.objects.get(pk=company_id)
form = FleetForm(request.POST)
fleet = form.save(commit=False)
fleet.company = company
new_fleet = fleet.save()

Подробнее см. Примечание в этом разделе документации API ModelForm .

Кстати, либо editable=False, либо exclude достаточно, чтобы удалить поле из ModelForm; вам не нужны оба.

1 голос
/ 22 августа 2013

в ответе Аймана Хури. Просто для устранения ловушки в Джанго. Если у вас есть поле «многие ко многим» в форме. это не будет сохранено здесь. Вы должны явно позвонить save_m2m(). добавьте еще одну строку, как показано ниже.

form.save_m2m()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...