2012-11-30 12 views
9

Wykonuję podstawową operację tworzenia/sprawdzania/zapisywania w Django ModelForm. Moje niestandardowe czyste metody nie są wywoływane, gdy wywoływana jest funkcja is_valid() podczas uruchamiania kodu pod debugerem Eclipse, a ja ustawiam punkt przerwania po utworzeniu formularza i wywołaniu funkcji is_valid().Django ModelForm niewymagające czyszczenia

Wiele razy prześledziłem kod bazowy Django i wydaje się, że słownik błędów w klasie ModelForm nigdy nie jest ustawiony na Brak, który wyzwala sprawdzanie poprawności. Podejrzewam, że jest to spowodowane interakcją z debuggerem uzyskującym atrybut _errors modeluForm do wyświetlenia w panelu zmiennych.

Po usunięciu wszystkich punktów przerwania i umożliwieniu naturalnego przepływu kodu, mogę udowodnić, że niestandardowy, czysty kod działa, wydając polecenia drukowania.

Czy jest to usterka w projekcie Django ModelForm, problem Eclipse, czy też mam na myśli złe drzewo?

models.py

from django.db import models 

class TestModel1(models.Model): 
    field1 = models.CharField(max_length=45) 
    field2 = models.IntegerField(default=2) 
    field3 = models.CharField(max_length=45, null=True, blank=True) 

forms.py

from order.models import TestModel1 
from django.forms import ModelForm 

class OrderTestForm(ModelForm): 

    def clean_field1(self): 
     return self.cleaned_data['field1'] 

    def clean_field2(self): 
     return self.cleaned_data['field2'] 

    class Meta: 
     model = TestModel1 

Moje jarzmo testowe:

from forms import OrderTestForm 

row = {'field1': 'test value', 'field2': '4', } 

ff = OrderTestForm(row) 

#ff.full_clean() 
if ff.is_valid(): 
    ff.save() 
else: 
    print ff.errors 
+0

Spróbuj: ff = OrderTestForm (data = row) – Brandon

+0

Dzięki za sugestię. Próbowałem bez żadnych zmian. Powinienem trochę wyjaśnić problem. Jeśli mam punkt przerwania Eclipse w tworzeniu ModelForm i STEP, a następnie wznawiam, punkty przerwania w clean nie są uruchamiane. ALE instrukcje drukowania w czyszczeniu są drukowane po wykonaniu tego pierwszego kroku. Oznacza to, jak sądzę, że gdy Eclipse próbuje uzyskać dostęp do obiektu ModelForm, aby odczytać jego atrybuty, uruchamia czyste. Jest to oczekiwane zachowanie zgodnie z dokumentacją Django. Tworzy jednak problem, ponieważ is_valid() nie będzie działał poprawnie. –

+0

Czy możesz opublikować swoją pełną sprawę testową? – Brandon

Odpowiedz

1

Co jeśli spróbujesz:

from order.models import TestModel1 
from django.forms import ModelForm 

class OrderTestForm(ModelForm): 
    class Meta: 
     model = TestModel1 

    def clean_field1(self): 
     value = self.cleaned_data['field1'] 
     print value 
     return value 

    def clean_field2(self): 
     value = self.cleaned_data['field2'] 
     print value 
     return value 
+0

Mam taki sam problem jak OP, a poszczególne środki czyszczące pola również nie są wywoływane. – GreenAsJade

0

Znalazłem "odpowiedź", która jest swego rodzaju brakiem odpowiedzi. Dokładny przypadek użycia polegał na otrzymaniu pliku CSV od klienta. Po sprawdzeniu rzeczywistego pliku danych klienta pola danych zostały wypełnione spacjami - wiele spacji. Przyciąłem wejście i wcisnąłem ten przycięty słownik do formy i wszystko działało. Nadal nie wyjaśnia, dlaczego zaćmiewa to Zaćmienie.

0

Miałem ten sam problem i próbowałem zagłębić się trochę i debugować ramy.

Jest chyba różnica między regularnych form i wzorów formularzy, które powoduje ten nie działa, ale to Hack (przesłanianie is_valid() zamiast clean(...)) pracował dla mnie:

def is_valid(self): 
    #run whatever ModelForm validations you need 
    return super(OrderTestForm, self).is_valid() 
+0

Problem polega na tym, że nie możesz dotknąć 'self.cleaned_data []' w tej metodzie, ponieważ nie została jeszcze utworzona. –

Powiązane problemy