2010-10-06 27 views
10

Tamam, neler olup bittiğini anlamaya çalışırken saatlerce bunu izliyorum. 'Model' anahtar sözcüğünü kullanarak varolan bir model örneğini geçirip onu kaydetmek için bir ModelForm oluşturmaya çalışıyorum. Koşuyorum kod buradaDjango ModelForm hiçbir hata olmadan doğrulama başarısız olur

class TempRuleFieldForm(ModelForm): 
    class Meta: 
     model = RuleField 

ve:

>>> m = RuleField.objects.get(pk=1) 
>>> f = TempRuleFieldForm(instance=m) 
>>> f.is_valid() 
False 

modeli nesne İşte (bu sorunun nedenini belirlemek için benim girişimleri orijinal önemli ölçüde soyulmuş) ModelForm olduğu (m yukarıda) geçerli ve iyi kaydeder, ancak formu doğrulamaz. Şimdi, anlayabildiğim kadarıyla, bu kod, burada bulunan Django docs örneğiyle aynı: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method, açıkçası bir şeyleri kaçırıyorum. Bana neyin yanlış olduğunu anlatmak için biraz taze göze önem veririm.

Teşekkür

bağlantı f.is_valid() çağırmaz
+2

'f.errors nedir? – sdolan

cevap

21

Not, sadece doğrudan kaydeder. Bu potansiyel olarak biraz yanıltıcıdır.

noktası sadece bir instance parametresi ile bir form başlatmasını ama hiçbir data verilerine birleştirmiş değil yapmasıdır ve form nedenle geçerli değil. f.is_bound'un False olduğunu göreceksiniz.

Sahnelerin ardında,, yalnızca, verileri yalnızca başlangıçta görüntülemek için kullanılan ve kaydetme için kullanılmadığı için initial verilerinin geçirilmesiyle aynıdır. Muhtemelen notes on bound and unbound forms'u okumanız faydalı olacaktır.

+3

+1. "Örnek, bağlı olmayı ima etmez": Bu doğru muhakeme. –

+0

Teşekkür ederim, bu mükemmel bir anlam ifade ediyor. Basit bir şey olacağını biliyordum ... – oogles

+0

Sadece açıklama için, f.is_valid() kullanmamın sebebi sadece soruyu daha özlü hale getirmekti. F.save() yöntemini kullanarak, clean_data alanında, form doğrulanıncaya kadar var olmayan bir AttributeError ile başarısız olur. Bu yüzden, _exactly_ kodunu kullandığımda bile gönderdiğim bağlantıda (f.is_valid() yerine f.save() kullanarak) hala başarısız oldu. – oogles

3

Yine de, veritabanında bulunan nesneyi doğrulamak istiyorsanız, önce serileştirebilir ve ardından bu formu da oluşturabilirsiniz.

from django.utils import simplejson 
from django.core.serializers import serialize 

(...) 

fields_dict = simplejson.loads(serialize('json', [obj]))[0]['fields'] 
form = forms.MyForm(fields_dict) 
if form.is_valid 

Bu muhtemelen bunu yapmanın en iyi yolu ancak bir modelden bir sınır formu almak için bulduk tek değil. İhtiyacım var çünkü veri tabanındaki mevcut verileri doğrulamak istiyorum. Bu bunu yapmanın en iyi yolu olduğunu düşünmüyorum çünkü ben bir soru oluşturun:

Transform an unbound form to a bound one?

+2

yukarıdaki örnekte işe "bütünleştirmek formu veri" şey, yani serileştirme ile ne elde ediyoruz . Django'nun django.forms.models.model_to_dict'ın söz konusu serileştirme işleminden daha iyi olacağına inanıyorum - sorunuza cevabımı görün: [link] (http://stackoverflow.com/questions/8993749/transform-an-unbound-form-to -a-bağlı-one # 8996585). – oogles

0

Bu OP için bir çözüm değildir, ancak oldukça yüksektir sonrası başlığı içindir Google. Bu yüzden here itibaren, yine de göndeririz: Zaten request.POST or None kullanarak forma request.POST veriyorsanız

ama hatasız hala geçersiz olduğunu, oluyor herhangi yönlendirme olmadığını kontrol edin. Yönlendirme, POST verilerinizi kaybeder ve formunuz, ayrılmamış olması nedeniyle hiçbir hata olmadan geçersiz olacaktır.

İlgili konular