2010-12-19 12 views
11

Django formları kullanıyorum. Ben modeli katmanında doğrulama ediyorum:Nasıl Django'mın views.py dosyasında bir ValidationError (veya benzer bir şey) yüklerim?

def clean_title(self): 
    title = self.cleaned_data['title'] 
    if len(title) < 5: 
     raise forms.ValidationError("Headline must be more than 5 characters.") 
    return title 

Ancak, ben views.py içinde doğrulamak için gereken bazı şeyler vardır. Örneğin ... kullanıcı son bir dakikadan daha uzun bir süre önce bir şey yayınladı mı?

Bu tür şeyler, model katmanının alamadığı request.user gerektirir. Bu yüzden, views.py dosyasında doğrulamam gerekir. Tam olarak böyle bir şey yapmak için views.py'de nasıl bir şey yaparım?

raise forms.ValidationError("Headline must be more than 5 characters.") 
+1

Bu, model katmanında doğrulama gibi görünmüyor (django.db.models.Model'de olduğu gibi. Django.forms.Form/ModelForm katmanını mı kastediyorsunuz? Sanırım –

+0

Farklı bir nedenden dolayı benzer bir gereksinime sahibim: sayfaya bağlı olarak yalnızca bazen gerekli olan bir alan var, bu yüzden görüntünün sayfaya sıkı sıkıya bağlı olduğu için zorlanması gerekiyor. –

cevap

12

Bence gruszczy'nin cevabı iyi bir şey, ama eğer sadece görüşte mevcut olduğunu düşündüğünüz değişkenleri içeren genel geçerlilikten sonraysanız, işte bir alternatif: formda argümanlar olarak varsayıma geçmek ve onlarla başa çıkmak formun ana clean() yönteminde.

Buradaki fark/avantaj, görünümünüzün daha basit kalması ve form içeriğiyle ilgili olan her şeyin, formda kabul edilebilir olmasının sağlanmasıdır.

örn: clean() yönteminde genel ValidationError yükselterek böylece elle formunu görüntülüyorsak sizin şablon {{form.non_field_errors}} içerdiğinden emin olun gerekecek myform.non_field_errors içine hatayı koyacağız

# IN YOUR VIEW 
# pass request.user as a keyword argument to the form 
myform = MyForm(user=request.user) 


# IN YOUR forms.py 
# at the top: 

from myapp.foo.bar import ok_to_post # some abstracted utility you write to rate-limit posting 

# and in your particular Form definition 

class MyForm(forms.Form) 

    ... your fields here ... 

    def __init__(self, *args, **kwargs): 
     self.user = kwargs.pop('user') # cache the user object you pass in 
     super(MyForm, self).__init__(*args, **kwargs) # and carry on to init the form 


    def clean(self): 
     # test the rate limit by passing in the cached user object 

     if not ok_to_post(self.user): # use your throttling utility here 
      raise forms.ValidationError("You cannot post more than once every x minutes") 

     return self.cleaned_data # never forget this! ;o) 

Not

+0

Mükemmel çözümünü bekleyebilir. Bu bir hack mi? Yine de onu seviyorum, Ty – TIMEX

+0

Hayır, buna hack demiyorum. Sadece Django Form sınıflarını varsayılan/öğretici yaklaşımdan daha fazla kullanıyor. Çok fazla yer kullandım ve (pop() 'un ne yapacağını bildiğiniz sürece, kwargs'dan anahtar kelime argümanını kaldırdığından, sizi yakalayacak hiçbir şey kalmaz. kwargs, get() yerine kullanın. –

4

Sen formları için sıra bu istisna olarak, görünümlerinde ValidationError kullanmayın. Daha doğrusu, kullanıcıyı başka bir URL'ye yönlendirmeli, ona açıklayacaktır, yakında tekrar yayınlayamayacaktır. Bu işi halletmenin doğru yolu budur. Giriş verileri doğrulanmadığında ValidationError, Form örneğinde yükseltilmelidir. Durum bu değil.

+0

Bunun iyi bir yaklaşım olduğunu düşünüyorum, ancak kullanılabilirlik açısından, bu mesajı yalnızca bir flash/django.contrib.messages iletisi olarak eklemek daha iyi olurdu ve * yeni bir sayfaya yönlendirmek değil * doldurulmuş form tekrar. Bu şekilde, kullanıcı, 50 saniye bekleyebilir ve verileri yeniden göndermeye gerek olmadan, –

İlgili konular