2008-09-16 15 views
7

Rapor oluşturmak için kullanılan sorguyu denetleyen alanlar için (başlangıç ​​tarihi, bitiş tarihi ...) bir Django formu (yeni formlar) kullanan bir web raporum var. Sorun şu ki, sayfanın formun başlangıç ​​değerlerini (ilişkisiz) kullanarak çalışması gerektiğidir, ancak is_valid() işlevini aramadıkça clear_data alanına erişemiyorum. Ancak is_valid(), ilişkisiz formlarda her zaman başarısız olur.Unbound formdan form değerleri nasıl kullanılır?

Django'nun formları, düzenlenmemiş bir formun HTML görüntülemekten başka bir şey için gerçekten yararlı olmadığı şekilde düzenleme verisi kullanımıyla tasarlanmış gibi görünüyor. Ben Örneğin

: (bu ilişkisiz olduğundan) bu bir GET ise başarısız olur

if request.method == 'GET': 
    form = MyForm() 
else: 
    form = MyForm(request.method.POST) 

if form.is_valid(): 
    do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date']) 

is_valid() ve bunu yaparsam:

if request.method == 'GET': 
    form = MyForm() 
    do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date']) 
else: 
    form = MyForm(request.method.POST) 
    if form.is_valid(): 
     do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date']) 

İlk arama için do_query, form_cleaned_data'daki istisnaları tetikler; bu geçerli bir alan değildir, çünkü is_valid() çağrılmamıştır. Ben böyle bir şey yapmak zorunda gibi görünüyor: is

if request.method == 'GET': 
    form = MyForm() 
    do_query(form['start_date'].field.initial, form['end_date'].field.initial) 
else: 
    form = MyForm(request.method.POST) 
    if form.is_valid(): 
     do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date']) 

, bir proteine ​​bağlı veya ilişkisiz bir biri arasındaki formun değerleri almak için ortak bir arayüz yoktur.

Bunu yapmanın daha temiz bir yolu var mı?

cevap

4

if request.method == 'GET': 
    form = MyForm() 
else: 
    form = MyForm(request.method.POST) 
    form.is_valid() 

do_query(form.get_cleaned_or_initial('start_date'), form.get_cleaned_or_initial('end_date')) 
0

Formunuza başlangıç ​​değerlerinin bir sözlük geçirebilirsiniz:

if request.method == "GET": 
    # calculate my_start_date and my_end_date here... 
    form = MyForm({ 'start_date': my_start_date, 'end_date': my_end_date}) 
... 

onlar Bunu göstermek official forms API documentation, bakınız.

düzenlemek: diğer kullanıcılardan yanıtlara göre, belki bu en temiz çözüm:

if request.method == "GET": 
    form = MyForm() 
    form['start_date'] = form['start_date'].field.initial 
    form['end_date'] = form['end_date'].field.initial 
else: 
    form = MyForm(request.method.POST) 
if form.is_valid(): 
    do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date']) 

olsa bu denemedim; Birisi bunun işe yaradığını söyleyebilir mi? Bu yeni bir yöntem oluşturmanın daha iyi olduğunu düşünüyorum, çünkü bu yaklaşım yeni 'sihirli' erişimcisinizi tanımak için başka bir kod (muhtemelen sizin tarafınızdan yazılmadı) gerektirmez. gibi daha sonra kodu yeniden yazabilirsiniz

def get_cleaned_or_initial(self, fieldname): 
     if hasattr(self, 'cleaned_data'): 
      return self.cleaned_data.get(fieldname) 
     else: 
      return self[fieldname].field.initial 

: Eğer Form sınıfına bu yöntemi eklerseniz

+0

Evet, ancak sonra varsayılan değerler formla tanımlanmaz (alan bildirimlerindeki initial = değeri gibi). Formu birden çok yerde kullanırsanız, varsayılan değerlerinizi tekrar etmeniz gerekir. – davidavr

1

Unbound anlamına şekliyle ilişkilendirilmiş hiçbir veri (orada ya başlangıç ​​ya da daha sonra verilir), böylece doğrulama başarısız olabilir. Diğer cevaplarda da belirtildiği gibi (ve kendi sonucunuza göre), başlangıç ​​değerlerini sağlamanız ve hem bağlı verileri hem de başlangıç ​​değerlerini kontrol etmeniz gerekir.

Formlar için kullanım durumu, ve doğrulama işlemlerini gerçekleştirir, bu nedenle cleaned_data'a erişmeden önce doğrulamak için bazı verileriniz olmalıdır.

İlgili konular