2011-08-19 14 views
19

Voglio riempire il modulo con i dati dell'istanza del modello. Ma la mia forma ha meno campi del modello. Se ho un codice come questo:Come posso compilare il modulo con i dati dell'oggetto modello?

class Item(models.Model) 
    name = models.CharField(max_length=100) 
    price = models.PositiveIntegerField() 

class ItemForm(forms.Form): 
    name = forms.CharField() 

Cosa c'è di sbagliato in questa funzione e in che modo dovrebbe apparire buono?

def bound_form(request, id): 
    item = Item.objects.get(id=id) 
    form = ItemForm(item.name) 
    return render_to_response('bounded_form.html', {'form': form}) 

ho sempre errore come questo: AttributeError: 'ItemForm' object has no attribute 'get'

+0

https://docs.djangoproject.com/en/1.3/topics/forms/modelforms/ –

+0

Sei sicuro che dovrei leggere qualcosa su 'ModelForm' se sto usando' Form' o pensi che io non so cosa ho bisogno? – krzyhub

risposta

26
def bound_form(request, id): 
    item = Item.objects.get(id=id) 
    form = ItemForm(initial={'name': item.name}) 
    return render_to_response('bounded_form.html', {'form': form}) 
+1

Odio essere critico ma non ho idea di come implementare la risposta. Questo va in forms.py o views.py? Come lo uso? –

+1

@AustinA: la funzione 'bound_form' è una vista, quindi va in views.py, e sta passando l'argomento' initial' al form per impostare i valori del form iniziale. – Serrano

40

Generalmente quando si crea un modulo per una modella, si vuole utilizzare ModelForm. Resta al principio DRY tale che non è necessario ridefinire i tipi di campo per la classe form. Gestisce automaticamente anche la convalida. Si mantiene la massima flessibilità per personalizzare i campi e i widget utilizzati. Utilizzare fields per specificare i campi desiderati o exclude per specificare i campi da ignorare. Con il vostro esempio:

from django import forms 
from django.shortcuts import get_object_or_404 

class ItemForm(forms.ModelForm): 
    class Meta: 
     model = Item 
     fields = ("name",) 

def bound_form(request, id): 
    item = get_object_or_404(Item, id=id) 
    form = ItemForm(instance=item) 
    return render_to_response('bounded_form.html', {'form': form}) 

get_object_or_404() è utile qui come una forma di gestione degli errori. Utilizzando Item.objects.get(id=id) su un ID mancante, verrà generata un'eccezione Item.DoesNotExist non bloccata. Potresti usare anche un blocco try/except, ovviamente.

+1

Questo dovrebbe essere contrassegnato come la risposta corretta, perché non dipende da nessun campo specifico, usa solo il modello di modulo – vascop

+1

Cosa succede se si dispone di un campo che non è memorizzato direttamente sul modello ma si desidera comunque modificarlo tramite questo modulo . L'uso di 'ModelForm' va bene, ma che ne dici di creare e inizializzare un campo aggiuntivo, magari con un valore da un ForeignKey del modello? – jozxyqk

+0

ModelForms supporta gli attributi ForeignKey e ManyToManyField. https://docs.djangoproject.com/en/1.4/topics/forms/modelforms/#field-types –

Problemi correlati