2014-04-11 2 views
0

장고 인라인 서식과 비슷한 기능을 구현하고 싶습니다. 내가 관심있는 것은 Django가 주 오브젝트의 유효성 검사 및 저장과 관련하여 인라인 형식의 관련 오브젝트를 처리하는 방법입니다.django가 인라인 폼의 유효성을 검사하고 저장하는 방법

두 모델, BlogEntry이 있다고 가정 해 보겠습니다. Entry에는 null이 아닌 Blog에 대한 외래 키가 있습니다. 블로그와 항목을 한 곳에서 만들 수 있기를 원합니다. Django 인라인 양식을 사용하는 방법은 다음과 같습니다.

blogform = BlogForm(request.POST) 
if blogform.is_valid(): 
    tmp = blogform.save(commit=False) 
    entriesform = EntryInlineFormset(request.POST, instance=tmp) 
    if entriesform.is_valid(): 
     entriesform.save() 
     blog.save() 

여기에는 어떤 문제가 있습니까? 장고는 블로그를 데이터베이스에 저장하지 않고 항목을 어떻게 검증 할 수 있습니까? 장고 코드에서이 코드를 찾으려고했지만, 실제로 코드를 작성한 곳을 찾을 수 없었습니다.

내 생각에 그들은 거래를 생성합니다. 블로그 양식을 저장하고 항목 양식이 유효하지 않은 경우 롤백합니다. 그러나 entriesform이 유효한 경우 다음은 무엇입니까? 블로그 인스턴스가 저장되어 있습니까? save이 결코 호출되지 않으면 어떻게됩니까?

두 가지 방법 (is_validsave)을 통해 트랜잭션을 확장합니까? 한 가지 방법으로 거래를 시작하고 다른 방법으로 끝내는 것이 가장 좋은 방법이라고 생각하지 않습니다.

답변

1

둘 중 하나에서 저장을 호출하기 전에 둘 다 유효성을 검사 할 수 있습니다. 부모 인스턴스와 formset 모두에 빈 인스턴스를 전달할 수 있습니다.

blog = Blog() 
blogform = BlogForm(request.POST, instance=blog) 
entriesform = EntryInlineFormset(request.POST, instance=blog) 
blog_valid = BlogForm.is_valid() 
entries_valid = entriesform.is_valid() 

if blog_valid and entries_valid: 
    ... save ... 

단락을 피하기 위해 양식을 별도로 확인하고 결과를 변수에 저장합니다.

+0

답장을 보내 주셔서 감사합니다. 이것은 조금 도움이되었지만, 아마 나 자신에 대해 잘 설명하지 못했습니다. django'BaseInlineFormset'의 구현이 유효성 검사를 통과해야하는 경우 블로그 ID (또는 기본적으로 널이 아닌 외부 키)를 얻을 수있는 방법을 알고 있습니까? 내 애플 리케이션에서 비슷한 무언가를 구현할 수 있도록 내부를 알고 싶습니다. – davekr

+0

유효성 검사에 FK가 필요한 위치의 예를 들려 줄 수 있습니까? "Django"는 formset에서이 작업을 전혀 수행하지 않습니다. 관리자가 [ModelAdmin.changeform_view] (https://github.com/django/django/blob/)에서 수행 한 동작을 참조 할 것으로 기대합니다. 마스터/django/contrib/admin/options.py # L1355). –

+0

네, 맞습니다. formset에 FK 검증이 없습니다. 저장하려고하면'IntegrityError'가 발생합니다. 'entriesform'는'blog' 인스턴스에 대한 참조를 유지하고'blogform'가 저장된 후에'entriesform'의 참조는 id를 가지며 formset을 저장할 수 있습니다. 이것은 제가 알고 싶었던 것입니다, 많은 감사합니다! – davekr

관련 문제