2011-08-19 6 views
19

Quiero completar el formulario con los datos de la instancia del modelo. Pero mi formulario tiene menos campos que el modelo. Si tengo un código como éste:¿Cómo puedo completar el formulario con los datos del objeto modelo?

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

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

Lo malo es con esta función y cómo debe mirar a ser bueno?

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

que conseguir error como este: AttributeError: 'ItemForm' object has no attribute 'get'

+0

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

+0

¿Estás seguro de que debería leer algo sobre 'ModelForm' si estoy usando' Form' o si piensas que no ¿Sabes lo que necesito? – krzyhub

Respuesta

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 ser crítico, pero no tengo idea de cómo implementar tu respuesta. ¿Esto va en forms.py o views.py? ¿Como lo uso? –

+1

@AustinA: La función 'bound_form' es una vista, por lo que va en views.py, y está pasando el argumento' initial' al formulario para establecer los valores iniciales del formulario. – Serrano

40

En general, cuando la creación de un formulario para un modelo, tendrá que utilizar ModelForm. Mantiene el principio DRY de manera que no es necesario redefinir los tipos de campo para la clase de formulario. También maneja automáticamente la validación. Usted conserva total flexibilidad para personalizar los campos y widgets utilizados. Use fields para especificar los campos que desea o exclude para especificar campos que ignorar. Con su ejemplo:

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() es útil en este caso como una forma de control de errores. El uso de Item.objects.get(id=id) en una ID faltante arrojará una excepción no capturada Item.DoesNotExist de lo contrario. Podría usar un bloque try/except también, por supuesto.

+1

Esto debe marcarse como la respuesta correcta, ya que no depende de ningún campo específico, solo usa el modelo – vascop

+1

¿Qué sucede si tiene un campo que no está directamente almacenado en el modelo pero aún desea editarlo a través de este formulario? . Usar 'ModelForm' está bien, pero ¿qué tal crear e inicializar un campo adicional, quizás con un valor de una ForeignKey del modelo? – jozxyqk

+0

ModelForms admite los atributos ForeignKey y ManyToManyField. https://docs.djangoproject.com/en/1.4/topics/forms/modelforms/#field -types –

Cuestiones relacionadas