BTW, django ile herhangi bir konuda sorun olursa [email protected] adresinden bana ulaşabilirsin.
Kolay gelsin. 2010/2/18 ozgurv <[email protected]>: > 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 > -- Ö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
