2009-06-06 2 views
5

У меня есть эта модель:Подставив отсутствующее значение поля при сохранении ModelForm

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 

ответ

8

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

Instantiate модели с начальными значениями для отсутствующих, но необходимых полей:

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() 

Для получения более подробной информации см. Примечание в this section of the ModelForm API documentation.

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

1

в ответе @Ayman Hourieh. Просто чтобы обратиться к ловушке в Django. Если у вас есть поле «много ко многим» в форме. он не спасется здесь. Вы должны явно позвонить save_m2m(). добавьте еще одну строку, как показано ниже.

form.save_m2m() 
Смежные вопросы