2009-06-06 8 views
5

Ho un questo modello:Sostituendo un valore di campo assente quando si salva un 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,) 

E poi un modulo basato su questo modello:

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

Quando uso questa forma in un modello, il campo "azienda" non viene aggiunto, il che è previsto. Ma quel campo è richiesto come vuoto! = Vero.

Il modo in cui utilizzo questo modulo, l'attributo della società sarà sempre noto nella funzione di visualizzazione, poiché è passato dall'URL. Come posso aggiungere la società al modulo nella funzione di visualizzazione prima di salvarla?

Qui è la mia opinione:

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 

risposta

8

Ci sono due modi per risolvere questo problema:

un'istanza per il modello con i valori iniziali dei dispersi, ma i campi richiesti:

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

Utilizza save(commit=False) e imposta manualmente i campi aggiuntivi richiesti:

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

Vedere la nota in this section of the ModelForm API documentation per ulteriori dettagli.

A proposito, o editable=False o exclude è sufficiente per rimuovere un campo da ModelForm; non hai bisogno di entrambi.

1

nella risposta di @Ayman Hourieh. Solo per affrontare una trappola a Django. Se hai un campo molti-a-molti nel modulo. non verrebbe salvato qui. Dovresti chiamare esplicitamente lo save_m2m(). aggiungi un'altra riga come sotto.

form.save_m2m() 
Problemi correlati