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