2009-06-06 6 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에서 전달되므로보기 기능에서 항상 알 수 있습니다. 저장하기 전에 어떻게 뷰 기능에서 폼에 회사를 추가 할 수 있습니까?

누락,하지만 필수 필드의 초기 값으로 모델을 인스턴스화 :

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

이 문제를 해결하는 방법은 두 가지가 있습니다

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

: 여기

내이다 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 또는 excludeModelForm에서 필드를 제거하기에 충분합니다. 당신은 둘 다 필요하지 않습니다. @Ayman Hourieh의 답변에

1

장고의 함정을 해결하기 위해서. 폼에 many-to-many 필드가있는 경우. 여기에 저장되지 않을 것입니다. 명시 적으로 save_m2m()으로 전화해야합니다. 아래와 같이 한 줄 더 추가하십시오.

form.save_m2m()