8 Mayıs 2014 Perşembe

Modellerden Form Oluşturma

Daha önceki form işlemlerinde modellerdeki alanlara göre formlar oluşturarak bu formları kullandık. Bu işlem biraz zahmetliydi. Yani, aynı alanı hem model içerisinde hemde form içerisinde yazıyorduk. Django bizi bu zahmetten kurtarıyor. Peki nasıl? Formları doğrudan modeller üzerinden oluşturacağız.
Şunu da söyleyelim; her form uygulaması bir modele sahip olmak zorunda değildir. Yani elimizde bulunan bir form veritabanı ile iletişime geçmek zorunda değildir. Örneğin; oluşturduğumuz bir iletişim formunda veritabanına ekleme işlemi yerine doğrudan mail atma işlemi yaparız. Bu kullanımda form bir modele sahip olmadığı için bu kullanıma örnek olmayacaktır. Formunu kendimiz tasarlamak zorundayız. Şimdi daha önce oluşturduğumuz DoktorFormu'nu modeller üzerinden oluşturalım.
from django.forms import ModelForm
from models import *
 class Meta:
  model = Doktor
                fields = ['adi','soyadi','yas','telefon','eposta']
 def clean_telefon(self):
  tel = self.cleaned_data['telefon']
  if tel != "":
   if len(tel) != 11:
    raise forms.ValidationError('Telefon numarasi 11 karakter olmalidir.')
  return tel
Gördüğünüz gibi işlemimiz ne kadar basit. Yapmamız gereken tek şey model özelliğine oluşturmuş olduğumuz modeli atamak. Hepsi bu. Burada kullandığımız fields özelliği ile model içerisinde olan alanlardan form içerisinde gözükmesini istediklerimizi belirtiyoruz. Eğer fields özelliğini kullanmazsak tüm alanlar form içerisinde olacaktır. Şu şekilde değiştirirsek.
fields = ['adi','soyadi']
Artık tarayıcıdan doktor-ekle adresine gidersek çıktı şu şekilde olacaktır.
fields özelliğinin tam tersi olarak exclude özelliği ile gözükmesini istemediğimiz alanları belirtiriz.
class Meta:
  model = Doktor
        exclude = ['telefon','eposta]
Bu kullanımda form içerisinde telefon ve eposta alanları gözükmeyecektir.
Oluşturmuş olduğumuz Doktor modelini bir hatırlayalım.
class Doktor(models.Model):

 adi = models.CharField(max_length=50,verbose_name="Adınız")
 soyadi = models.CharField(max_length=50,verbose_name="Soyadınız")
 yas = models.IntegerField(blank=True,verbose_name="Yaşınız",validators=[
  MaxValueValidator(70),
  MinValueValidator(30)
  ]
 )
 telefon = models.CharField(max_length=50,blank=True,verbose_name="Telefon Numaranız")
 eposta = models.EmailField(blank=True,verbose_name="E-Posta Adresiniz")

 def __unicode__(self):
  return u'%s , %s ,%s' % (self.adi,self.soyadi,self.eposta)
Modelde alanlara verbose_name argümanını eklediğimizi fark etmişsinizdir. Bu alan modellerden form oluşturulduğu zaman form alanlarına ait etiketleri niteler. Yani artık formdaki alanlar aşağıdaki gibi olacaktır.
Formları bu şekilde kullanmanın bir başka güzelliğine gelelim. Görünümlerde kullandığımız form nesnelerinin kaydetme özelliği vardır. Yani artık verileri alıp veritabanına kaydetmek ile uğraşmak zorunda değiliz. Django bunu bizim için yapacak.
doktor_ekleme formunu şu hale getiriyoruz.
def doktor_ekleme(request):
 doktorID = request.GET.get('id')
 if doktorID:
  try:
   doktor = Doktor.objects.get(id=doktorID)
   form = DoktorFormu(instance=doktor)
  except:
   return HttpResponse(u'Aradığınız doktor bulunamadı. ID= %s' % (doktorID))

 if request.GET.get('sil'):
  doktor.delete()
  return HttpResponseRedirect('/doktorlar/')

 if request.method == 'POST':
  if doktorID:
   form = DoktorFormu(request.POST,instance=doktor)
  else:
   form = DoktorFormu(request.POST)
  if form.is_valid():
   form.save()
   return HttpResponseRedirect('/doktorlar/')
 else:
  if doktorID:form = DoktorFormu(initial=doktor.__dict__)
  else: form = DoktorFormu()

 return render_to_response('form.html',
        {'form':form,'baslik':'Doktor İşlemleri'},
        context_instance = RequestContext(request))
İşler biraz daha kolaylaştı değil mi?
Varsayılan Değerleri Değiştirme
Modelde bulunan bir CharField form içerisinde <input type="text"> alanı oluşturacaktır. Örneğin Hasta modeli içerisinde açıklama alanı olduğunu düşünürsek. Bu alanın <textarea> olmasını isteyebiliriz. Bu durumda widgets özelliğini kullanabiliriz. Hasta modeli içerisinde açıklama alanı olduğunu düşünürsek şu şekilde bir kullanım işimizi görecektir.
class HastaFormu(ModelForm):
    class Meta:
        model = Hasta
        widgets = {
        'aciklama': Textarea(attrs={'cols':35,'rows':5}),
        }

Kaynakça

0 yorum :

Yorum Gönder