2011-08-19 14 views
19

Chcę wypełnić formularz danymi z instancji modelu. Ale moja forma ma mniej pól niż model. Jeśli mam taki kod:Jak mogę wypełnić formularz danymi obiektu modelu?

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

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

Co jest nie tak z tą funkcją i jak powinno wyglądać dobrze?

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

otrzymuję błąd tak: AttributeError: 'ItemForm' object has no attribute 'get'

+0

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

+0

Czy jesteś pewien, że powinienem przeczytać coś o 'ModelForm' jeśli używam' Form' lub czy myślisz, że ja don? nie wiem, czego potrzebuję? – krzyhub

Odpowiedz

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

Nienawidzę być krytyczny, ale nie mam pojęcia, jak wdrożyć swoją odpowiedź. Czy dzieje się to w forms.py lub views.py? Jak z niego korzystać? –

+1

@AustinA: Funkcja 'bound_form' jest widokiem, więc przechodzi do views.py i przekazuje argument" initial "do formularza, aby ustawić początkowe wartości formularza. – Serrano

40

Generalnie podczas tworzenia formularza dla modelu, będziemy chcieli, aby korzystać ModelForm. Trzyma się zasady DRY, tak, że nie musisz na nowo definiować typów pól dla klasy formularza. Automatycznie obsługuje także sprawdzanie poprawności. Zachowujesz pełną elastyczność dostosowywania używanych pól i widżetów. Użyj fields, aby określić żądane pola lub exclude, aby określić pola do zignorowania. Z Twojego przykład:

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() jest przydatna tu jako forma obsługi błędów. Użycie numeru Item.objects.get(id=id) na brakującym identyfikatorze spowoduje odrzucenie nieprzechwyconego warunku Item.DoesNotExist. Można oczywiście użyć bloku try/except.

+1

To powinno być oznaczone jako poprawna odpowiedź, ponieważ nie zależy od żadnego konkretnego pola, po prostu używa modelu modelowego – vascop

+1

Co zrobić, jeśli masz pole, które nie jest bezpośrednio zapisane w modelu, ale nadal chcesz je edytować za pomocą tego formularza . Używanie 'ModelForm' jest w porządku, ale co z tworzeniem i inicjalizowaniem dodatkowego pola, być może z wartością z klucza obcego modelu? – jozxyqk

+0

ModelForms obsługuje atrybuty ForeignKey i ManyToManyField. https://docs.djangoproject.com/en/1.4/topics/forms/modelforms/#field-types –

Powiązane problemy