2011-12-15 4 views
2

이것은 바보 같은 질문 일 수 있지만 cleaned_data를 수동으로 설정하는 것이 안전한지 확실하지 않습니다. 워드 프로세서 says : is_valid 일단Django에서 cleaned_data를 수동으로 설정할 때 위험합니까?

()는 True를 반환합니다, 당신은 양식에 의해 정의 된 유효성 검사 규칙을 준수하는 것이 지식의 안전 양식 제출 를 처리 할 수 ​​있습니다. 이 지점에서 request.POST에 직접 액세스 할 수 있지만 form.cleaned_data에 액세스하는 것이 좋습니다. 이 데이터는 에 대해서만 유효성이 검사되었지만 관련 파이썬 유형으로도 변환됩니다.

자세한 내용은 책 제목, 책 저자 및 URL을 묻는 필드와 같은 여러 필드가있는 modelform이 있다고 가정 해보십시오.

양식 조건은 다음과 같습니다. url 필드가 비어 있으면 사용자는 제목과 작성자를 제공해야합니다. url 필드가 주어지고 그 밖의 것이 없다면, 주어진 url로부터 html을 파싱하고 사용자를 위해 자동으로 제목과 저자를 추출합니다.

URL에서 제목과 작성자를 자동으로 가져 오는 경우 양식에서 작성자 및 제목에 대해 빈 cleaned_data가 반환되므로이 데이터를 모델에 저장하는 가장 좋은 방법은 무엇입니까? 구문 분석 된 데이터가 내가 모델에있는 유효성 검사 규칙을 준수하는지 확인했지만 cleaned_data를 설정하면 의심스러운 것으로 보입니다. modelform 클래스에서

:

def save(self, commit = True, *args, **kwargs): 
    parsed_title = ... # String returned by my html parsing function 
    parsed_author = ... # String returned by my html parsing function 
    self.cleaned_data['title'] = parsed_title 
    self.cleaned_data['author'] = parsed_author 



편집 : 이것은 약간은

def save(self, commit=True, *args, **kwargs): 
    instance = super(BookInfoForm, self).save(commit=commit, *args, **kwargs) 
    .... 
    instance.title = parsed_title 
    instance.author = parsed_author 

    return instance 

입니다 :

덕분에, 내가 그렇게처럼 만들어 f 주제는 이미 원래 질문에 답했기 때문에 위의 코드는 다른 부분을 깰 수 있습니다. 컴파일 된 정보를 http://..../media/books/<id>에 저장하는 대신 <id>이 서적 ID 인 경우 http://..../media/books/None에 저장합니다. 내가 ID = 없음을 얻을되지 않도록 ID가 존재 확인 할 수있는 방법이 있나요

def insert_or_modify(request, id=None): 
    if id is not None: 
     book = BookModel.objects.get(pk=id) 
    else: 
     book = BookModel() 

    if request.method == 'POST': 
     form = BookInfoForm(request.POST, instance=book) 
     if form.is_valid(): 
      form.save() 

    .... 

    return render_to_response(...) 

:

나는 추가 및 편집 처리 내 views.py에 추가/편집 기능이? 좀 더 구체적으로, modelform의 save()에서 instance.id = None 인 경우 id를 사용하여 새 인스턴스를 만드는 방법이 있습니까? super (ModelForm, self) .save (...)를 호출하면 나에게 그렇게 할 수 있다고 생각했지만?

다시 한번 감사드립니다!

답변

4

귀하가 제시하는 경우 귀하의 의도는 모델 데이터가 아니라 청소 된 데이터를 설정하는 것입니다. 따라서 save 메소드에서 cleaned_data를 설정하는 대신 self.instance의 속성을 설정하고 저장하십시오.

수동으로 cleaned_data를 설정하는 것은 필연적이라고 생각하지 않습니다. 일반적인 경우는 아니지만 일부 교차 필드 유효성 검사의 경우 양식의 정리 방법에서이를 수행하는 것이 좋습니다.

+0

감사합니다. 인스턴스를 사용하는 것이 더 좋겠지 만 이제는 instance.id의 존재 여부를 처리하는 방법에 대해 혼란스러워합니다 (편집 된 게시물 참조). – sharkfin

관련 문제