Merhaba;

Örneğinden gidiyorum:

from django.db import models
from django.forms import ModelForm
from django.contrib.auth.models import User

class Yazilar(models.Model):
   yazi = models.CharField(max_length=200)
   temsilci = models.ForeignKey(User)

class YaziForm(ModelForm):
       class Meta:
       model = Yazilar

Gözüme ilk önce çarpan mantıksal yanlış şu: Kullanıcılar yazının
sahibini değiştirememesi gerekir. Sadece yazının içeriğini
değiştirebilmeleri daha mantıklı. Ben yazdığım bir yazının
temsilcisini sen yapamamalıyım. O yüzden formda temsilci bölümünün
görünmemesi gerekir. Görünmemesi için:

class YaziForm(ModelForm):
       class Meta:
       model = Yazilar
       exclude = ("temsilci",)

Formlar için URL ayarlaması gibi bir kavram yok. Formu kullanacağınız
view için kendin elinizle url tanımlaması yapıyorsun. Örnek veriyorum;
Modelform yardımıyla yeni bir yazı objesi save edeceğim veritabanına.

------
def save_yazilar(request): # Bu controller'in url'i "/yazi/save/" olsun.
    if request.POST:
        form = YaziForm(request.POST)
        if form.is_valid():
            yeni_yazi_objesi = form.save(commit = False)
            yeni_yazi_objesi.temsilci = request.user
            yeni_yazi_objesi.save()
            return HttpResponse("Veritabanina kaydedildi. Yeni yazi
objesinin id'si : %d" % yeni_yazi_objesi.pk)
       else:
            render_to_response("yazi_kaydet.html", {"form": form},
context_instance=RequestContext(request))
   return render_to_response("yazi_kaydet.html", {"form":
YazilarForm()}, context_instance=RequestContext(request))
-----

yazi_kaydet.html'in içeriği de şöyle olacak.

<form action="/yazi/save/" method="POST">
 <table>
  {{form.as_table}}
 </table>
 <input type="submit" value="kaydet" />
</form>

Açıklama: Kodun akışını açıklıyorum:

1) kullanıcı ilk kez /yazi/save/ url'ini istediğinde boş bir tane form görecek.
2) Forma hiç bir şey yazmadan gönderirse. request.POST querydict'inin
içeriği şöyle olacak: {'yazi': ''}
2) form.is_valid() "yazi" field'i boş string olamaycağı için bize False diyecek.
3) Else kısmına giren kod hatalı formu kullanıcıya geri basacak.
Hatalı form nedir diye merak ediyorsan terminalde şöyle birşey
yazabilirsin.

In [1]: y = YaziForm()  # yeni form
In [2]: print y.as_table()
Out[2]: u'<tr><th><label for="id_yazi">Yazi:</label></th><td><input
id="id_yazi" type="text" name="yazi" maxlength="200" /></td></tr>'

In [3]: y = YaziForm({"yazi": ''}) # hatalı form
In [4]: print y.as_table()
In [4]: u'<tr><th><label for="id_yazi">Yazi:</label></th><td><ul
class="errorlist"><li>This field is required.</li></ul><input
id="id_yazi" type="text" name="yazi" maxlength="200" /></td></tr>'

4) Eğer kullanıcı bir yazi girip kaydet'e basarsa; is_valid() metodu
True diyecek ve biz de yaptığımız 1 2 ayarlama ile veritabanına yaziyi
kaydedeceğiz.

----
            yeni_yazi_objesi = form.save(commit = False) #
veritabanına kaydedilmedi.
            yeni_yazi_objesi.temsilci = request.user
            yeni_yazi_objesi.save() # veritabanına kaydedildi.

----

Bir yazının kaydedilebilmesi için o yazinin temsilcisi kim bilmemiz
gerekiyor. Ama kullanıcının bize yolladığı bilgide temsilci bilgisi
yok. Temsilci de aslında bilgiyi gönderen kişi yani request.user.
o yüzden formu veritabanına kaydetmeden önce form.save(commit = False)
komutu ile formun bize ürettiği ama veritabanına kaydetmediği Yazılar
objesini alıp onun temsilcisini request.user yapıyoruz. Daha sonra o
formun ürettiği objeyi biz veritabanına kaydediyoruz.


2010/2/17 "H.İbrahim YILMAZ" <[email protected]>:
> Alper KANAT yazmış:
>> Merhaba,
>>
>> ModelForm için örnekleri raptiye'de (http://github.com/tunix/raptiye)
>> bulabilirsiniz. Sorularınıza cevap vermeye çalışacağım elimden
>> geldiğince.. Yalnız önemli bir şey söyleyeyim. Kodunuzda Türkçe
>> değişken, sınıf isimleri vs. kullanmamanızı tavsiye ederim. Yarın
>> destek alırken (irc, e-posta kanalları üzerinden mesela) ya da
>> kodunuzu başkaları okuması gerektiğinde bu konuda sıkıntı çekmeyin.
>>
>> ModelForm dediğiniz şey varolan model'in alanlarını (field) kullanarak
>> bir form yaratmaya yarar ve form.save() dediğinizde otomatik olarak
>> bir nesne kaydeder. ModelForm sınıfını genişleterek yazdığınız bir
>> sınıf neticede bir Form'dur ve normalde bir formu django'da nasıl
>> kullanıyorsanız o şekilde kullanıyorsunuz; herhangi bir farkı yok.
>>
>> Form için URL ayarlaması yapmıyorsunuz. django'da URL'ler view denen
>> metodlara bağlı. *Bu metodlar içerisinde yarattığınız formu
>> kullanıyorsunuz.*
>>
>> Umarım faydalı olur yazdıklarım ama raptiye'de bu söylediklerim için
>> epey örnek var.
>>
>> ---
>> Quis custodiet ipsos custodes?
>>
>>
>> 17 Şubat 2010 11:58 tarihinde "H.İbrahim YILMAZ"
>> <[email protected] <mailto:[email protected]>>
>> yazdı:
>>
>>     Merhaba,
>>     Yazdığım uygulamaya veri girişi yapabilmek için bildiğimiz yollaardan
>>     form oluşturmak yerine, Django'nun mutlaka vardır bir "zımbırtısı"
>>     diyerek araştrınca karşıma ModelForm denilen olay çıktı. Fakat (yine
>>     evet!) anlayamadığım bazı noktalar oldu. Caveplarınız için şimdiden
>>     teşekkür ederim.
>>
>>     Aşağıdaki şekilde bir Modelim var.
>>
>>     from django.db import models
>>     from django.contrib.auth.models import User
>>
>>     class Yazilar(models.Model):
>>        yazi = models.CharField(max_length=200)
>>        temsilci = models.ForeignKey(User)
>>
>>     Bu model için yine model.py içinde Form olşturduğumda aldığı hal
>>     budur.
>>     Sanırım buraya kadar herhangi bir sorun yok.
>>
>>     from django.db import models
>>     from django.forms import ModelForm
>>     from django.contrib.auth.models import User
>>
>>     class Yazilar(models.Model):
>>        yazi = models.CharField(max_length=200)
>>        temsilci = models.ForeignKey(User)
>>
>>     class YaziForm(ModelForm):
>>            class Meta:
>>            model = Yazilar
>>
>>     Esas orum şu şimdi bu yarattığım form için gerekli olan url
>>     ayarlamasını nasıl vereceğim? İkincisi ModelForm'lar otomatik
>>     olarak save() fonsiyonunu kullanıyor mu? Son olarak bunun için
>>     herhangi bir views.py içine yazmam gereken view var mı? İnanın
>>     kafam durdu :) Keşke bi yerlerde ufak tefek applicationlar olsa ne
>>     bileyim adres defteri v.s gibi... Showmedo'dan izlediğim
>>     uygulamaar biraz daha üst seviyede kalıyor...
>>
>>     Saygılarımla.
>>
>>     --
>>     H.İbrahim YILMAZ
>>     Sales & Technical Manager
>>     Marmara Bilişim
>>     Hürriyet Sokak 6/A YALOVA
>>     Tel: +90 226 813 3131
>>     http://www.bilisimmarmara.com.tr
>>     Bu e-posta sadece yukarıda isimleri belirtilen kişi/ler arasında
>>     özel haberleşme amacını taşımaktadır. Size yanlışlıkla ulaşmış ise
>>     lütfen bizi bilgilendiriniz ve mesajı sisteminizden siliniz. Bu
>>     e-posta içeriği veya ekindeki dosyalar kişisel ve yazarına aittir.
>>     Bu nedenle Marmara Bilişim bu mesajın içeriği ve ekleri ile ilgili
>>     olarak hiçbir hukuksal sorumluluk taşımaz ve kabul etmez. /// This
>>     e-mail is intended only for the use of the individual/s to whom it
>>     is addressed. If you are not the intended recipient of the
>>     message, please immediately inform us and delete it from your
>>     system. Any opinions contained in this message belong to the
>>     author and do not constitute a commitment by Marmara Informatics.
>>
>>     _______________________________________________
>>     Linux-programlama mailing list
>>     [email protected]
>>     <mailto:[email protected]>
>>     http://liste.linux.org.tr/mailman/listinfo/linux-programlama
>>     Liste kurallari: http://liste.linux.org.tr/kurallar.php
>>
>>
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> Linux-programlama mailing list
>> [email protected]
>> http://liste.linux.org.tr/mailman/listinfo/linux-programlama
>> Liste kurallari: http://liste.linux.org.tr/kurallar.php
>>
> Merhaba,
> Raptiyede gözüme çarpamdı acaba hangi uygulamanızda kullandınız? Esas
> olarak anlamakta zorluk çektiğim noktalar şunlar:
> 1-)Yarattığımız bu formu template içerisinde nasıl çağırıyoruz?
> 2-)Bu formu diyelim ki çağırdık, bu formun "action" adresi nasıl olcak?
> Saygılar...
> _______________________________________________
> Linux-programlama mailing list
> [email protected]
> http://liste.linux.org.tr/mailman/listinfo/linux-programlama
> Liste kurallari: http://liste.linux.org.tr/kurallar.php
>



-- 
Özgür Vatansever
_______________________________________________
Linux-programlama mailing list
[email protected]
http://liste.linux.org.tr/mailman/listinfo/linux-programlama
Liste kurallari: http://liste.linux.org.tr/kurallar.php

Cevap