2012-08-27 2 views
4

Pycharm을 사용하여 장고에서 폼 유효성 검사를 디버깅하려고합니다. ImageField를 통해 업로드 한 이미지에서 내 양식의 유효성 검사가 실패하고 왜 실패했는지 확인하고 싶습니다. 그러나 유효성 검사 프로세스를 디버그하고 POST 데이터로 양식 초기화를 수행 할 때마다 유효성 검사를 시도하지 않고 양식 데이터를 저장할 때 빈 필드로 인해 오류가 발생합니다. 데이터 베이스. 그것은 내게 열매를 맺고 있습니다 ... 어떻게 행동이 개별 단계를 관찰 하느냐 여부에 따라 바뀔 수 있습니까? 또한 여러 개의 중단 점을 설정하려고했습니다. BaseForm 클래스의 풀 클린 (full-clean) 메소드를 사용하는 동안, 그러나 거기에 도달하지 못하는 것 같습니다. Pycharm에서 폼 유효성 검사 디버깅

편집

: 여기은 몇 가지 코드를입니다

내 모델 & 형태 :

class Car(models.Model): 
    ... 
    image = models.ImageField(upload_to='car_images/',blank=True,null=True) 

class CarForm(ModelForm): 
    class Meta: 
     model = Car 

내보기 :

def create_car(request): 
    if request.method == 'POST': 
     car_form = CarForm(request.POST,request.FILES) 
     if car_form.is_valid(): 
      ... 
+1

코드가 없으면 아무도 도움을 줄 수 없습니다. – Jingo

+0

일부 코드를 추가했습니다 –

+0

양식에'enctype = "multipart/form-data"'가 있습니까? –

답변

3

이 진짜 고통이다. 나는이 문제를 두 번이나 받았지만 여전히 좋은 해결책을 찾지 못했습니다.

이것은 양식의 __init__ 메서드를 재정의 할 때 안전한 디버깅의 예입니다.

class MyForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 

     # Disable form validation for debugging purposes unless the 
     # object is fully initialized. Set breakpoints BELOW this line. 
     del self._errors 

     # Write some additional initializations here, debug safely. 
     ... 

     # Initialization is finished. Enable form validation. 
     self._errors = None 

그런 다음 같은 방법으로 장고 코드를 패치 기본 폼 클래스를 디버깅 할 경우.

디버깅 후 추가 코드를 남기거나 제거 할 수 있습니다. 큰 차이는 아닙니다. 그러나 앞으로 필요할 경우를 위해 떠나는 것이 낫습니다.

그래서 실제로 무엇이 진행되고 있습니까?

(장고 프로젝트 사이트에 버그 보고서는 : https://code.djangoproject.com/ticket/24710)

문제가 (정말 @property 장식이있는 방법이다) 장고의 BaseForm.errors 속성 게터 너무 많이한다는 것을 보인다. full_clean() 메서드를 호출하여 _errors 속성 값을 변경하므로 errors 게터가 반복 호출에서 동일한 작업을 수행하지 않습니다.

class BaseForm(object): 

    @property 
    def errors(self): 
     if self._errors is None: 
      self.full_clean() 
     return self._errors 

    def full_clean(self): 
     self._errors = ErrorDict() 
     ... 

물론 PyCharm 디버거 특성은 단지 속성 있다고 가정하고, 그들은 객체의 내부 상태에 중요한 변경을하지 않습니다. 따라서 __ini__ 메소드를 디버깅 할 때 디버거는 errors 게터를 호출하여 "변수"창에 값을 표시합니다. 그리고 이것은 정상적인 실행 흐름을 파괴합니다.

한 가지 제안 중단을 방지 단계별 실행 형태의 __init__ 방법의 내부 일 수있다

는 (만약 그러한 경우가 아닌 특성 get_error() 같은 방법을 정의해야하는 이유이다). 그러나 실제로 디버깅해야한다면 단계별 실행 중에 _errors 속성이 존재하지 않도록 코드를 수정하십시오. 이렇게하면 full_clean 메소드 호출이 금지됩니다. PyCharm 디버거는 errors 속성에 액세스하려고 할 때마다 오류를 수신합니다.

참고 : 실행이 중지 될 때 errors 속성에도 __init__ 방법 이외의 어떠한 단계에서 평가 될 수있다. 모든 필드가 이미 완전히 초기화 된 경우 결과에 영향을주지 않을 것입니다 (__init__ 메소드에서만 수행해야 함). 그러나 is_valid 메서드 호출에 도달하기 전에 양식의 유효성이 확인되므로 양식 유효성 검사 프로세스를 디버그 할 수 없습니다. 이 경우 full_clean 메서드 내부에 중단 점을 설정하고 양식 인스턴스화 지점과이 중단 점 사이에서 중단하지 마십시오.