2011-08-19 18 views
19

Model örneğindeki verileri içeren formu doldurmak istiyorum. Ama formumun modelden daha az alanı var. Böyle bir kodum varsa: Bu işlevdeki yanlış nedir ve nasıl iyi görünmelidir? Model nesne verileriyle formu nasıl doldurabilirim?

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

böyle hata alıyorum: AttributeError: 'ItemForm' object has no attribute 'get'

+0

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

+0

Eğer 'Form' kullanıyorum 'ModelForm' ile ilgili bir şey okumam gerektiğinden emin misiniz? Neye ihtiyacım olduğunu bilmiyorum? – krzyhub

cevap

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

Kritik olmaktan nefret ediyorum ama cevabınızı nasıl uygulayacağımı bilmiyorum. Bu forms.py veya views.py içinde mi gidiyor? Bunu nasıl kullanabilirim? –

+1

@AustinA: İşlev "bound_form" bir görünümdür, bu nedenle views.py dosyasına gider ve ilk form değerlerini ayarlamak için forma "initial" argümanını iletir. – Serrano

40

Genellikle Modeli için bir form oluştururken, ModelForm kullanmak isteyeceklerdir. Form sınıfı için alan türlerini yeniden tanımlamanız gerekmediği için KURUMSAL prensibine tutar. Ayrıca doğrulama işlemini otomatik olarak gerçekleştirir. Kullanılan alanları ve widget'ları özelleştirmek için tam esnekliği korursunuz. İstediğiniz alanları belirtmek için fields kullanın veya yok sayılacak alanları belirtmek için exclude kullanın. sizin örnek ile:

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() hata işleme biçimi olarak burada yararlıdır. Eksik kimlikte Item.objects.get(id=id) kullanmak, aksi halde yakalanmamış bir Item.DoesNotExist istisnası atar. Ayrıca bir try/except bloğunu da kullanabilirsiniz.

+1

Bu, doğru bir yanıt olarak işaretlenmelidir, çünkü belirli bir alana bağlı değildir, sadece modelformu kullanır – vascop

+1

Modelde doğrudan depolanmayan ancak yine de bu form aracılığıyla düzenlemek istediğiniz bir alanınız varsa . 'ModelForm' kullanmak gayet iyi, ama belki de bir modelin bir ForeignKey değerinden başka bir alan yaratmak ve başlatmak için ne dersiniz? – jozxyqk

+0

ModelForms, ForeignKey ve ManyToManyField özelliklerini destekler. https://docs.djangoproject.com/en/1.4/topics/forms/modelforms/#field-types –

İlgili konular