2013-12-09 3 views
0

폼에 대한 첫 번째 유효성 검사기를 수행했습니다.이 작업이 수행되는 방식이 아닌 것 같습니다.django 폼 유효성 검사가 잘못된 코드처럼 보입니다.

작동하지만 추악한 코드처럼 보입니다. 누군가 도움을 줄 수 있습니까?

내 양식 :

class CountryForm(forms.ModelForm): 
    """Form to create or edit Countries.""" 

    class Meta: 
     model = Country 

    def clean_name(self): 
     raw_data = self.cleaned_data['name'] 
     data = raw_data.title() 

     try: 
      Province.objects.get(name=data).exists() 
      raise forms.ValidationError("There is already a province with the name: %s") % data 
     except: 
      pass 
     try: 
      Region.objects.get(name=data).exists() 
      raise forms.ValidationError("There is already a region with the name: %s") % data 
     except: 
      pass 
    return data 

내 생각은 이름이 다른 두 모델에 이름으로 존재하는지 확인하고 수행 할 때 오류가 발생하는 것입니다.

답변

1

여기서 잘못된 Queryset 방법을 사용하고 있습니다. get()exists() 메서드가없는 모델 객체를 반환합니다. filter()을 사용해야합니다.

또한 exists()은 예외를 발생시키지 않습니다. 업데이트를뿐만 아니라 clean 메서드가 호출됩니다 염두에

if Province.objects.filter(name=data).exists(): 
    raise forms.ValidationError(...) 

곰을뿐만 아니라 생성 : 그래서 당신은 단지 if 정상적인 작업을 수행 할 수 있습니다. 업데이트시 수정중인 인스턴스가 동일하게 나타나기 때문에 검사가 실패합니다. 양식 인스턴스를 가지고 있으며, 인스턴스가 pk 값을 갖는 경우이 검사를 우회해야

if not (form.instance and form.instance.pk): 

마지막으로, 당신은 결코 베어 except 문을 사용해야합니다. 그러면 모든 예외가 catch되어 잠재적으로 코드에 대한 실제 문제가 숨겨집니다. 코드에서 발생할 특정 예외 (이 경우 Province.DoesNotExist)를 항상 잡으십시오.

+0

고마워요, 훨씬 더 명확하게 :) –

+0

하지만 내가 어디에 있는지 모르겠다 (form.instance 및 form.instance.pk) : 만약 내가 들여 쓰기와 함께 2 다른 수표 전에 생각하지만, 그게 나던 속임수를 쓰는 것 같다. –

0

clean_name 함수에서 항상 예외를 처리하고 유효성 검사 예외를 발생시키지 않으므로이 방법은 작동하지 않습니다!

가 대신 그 이상이

 

if Province.objects.filter(name=data).exists() or Region.objects.filter(name=date).exists(): 
    raise forms.ValidationError("...") 

을, 당신의 코드는 잘입니다!

+0

레코드가 없거나 여러 레코드가 반환되면'Province.objects.get (name = data)'는 예외를 throw합니다. – karthikr

+0

예, get 대신 filter를 사용해야합니다. – Serafeim

관련 문제