2012-08-26 2 views
3

나는 일부 모델은 GenericForeignKey와 연결 한 :장고 형태

Class Main(models.Model) 
    filed_1  = models.CharField(max_length=20) 
    object_id = models.PositiveIntegerField() 
    content_type = models.ForeignKey(ContentType) 
    object  = generic.GenericForeignKey('content_type', 'object_id') 

Class Additional_1(models.Model): 
    f_1 = models.CharField(max_length=20) 
    f_2 = models.CharField(max_length=20) 

Class Additional_2(models.Model): 
    d_1 = models.CharField(max_length=20) 
    d_2 = models.CharField(max_length=20) 

그리고 형태를이 모델 : MainForm의 필드로 구성 형태를 만드는 방법

Class MainForm(forms.ModelForm): 
     class Meta: 
      model = Main 
      fields = ('filed_1', 'object_id', 'content_type') 

      widgets = { 
       'object_id': forms.HiddenInput, 
       'content_type': forms.HiddenInput 
      } 

Class Additional_1Form(forms.ModelForm): 
    class Meta: 
     model = Additional_1 
     fields = ('f1', 'f2') 

Class Additional_2Form(forms.ModelForm): 
    class Meta: 
     model = Additional_2 
     fields = ('d1', 'd2') 

+1 Additional_iForm을 하나의 제출 양식 버튼 (MainForm + Additional_1FormMain + Additional_2Form)으로 만들고 올바른 작성과 편집을 제공하십시오. ForeignKey 인라인 formset 같은 표준 장고 구성 요소를 사용하여 그것을 할 방법이 있습니까?

P. 이 질문에 대한 대답은 문서의이 섹션에 포함되어야한다고 생각하지만 대답 할 정보가 너무 적습니다. https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#generic-relations-in-forms-and-admin

EDITION # 1

# This is always false, because of 'object_id' in main_form 
if main_form.is_valid() and additional_1_form.is_valid(): 
    additional = additional_1_form.save() 
    main_form.object_id = additional .id # I need something like this to set object_id 
    main_form.save() 

답변

1

한 형태의 태그를 생성 : {{ mainform }}, {{ additional_form_1 }}{{ additional_form_2 }} 장고 양식의 각 각에 대해 생성하는 HTML입니다

<form action="..." method="POST"> 
{{ main_form }}  
{{ additional_form_1 }}  
{{ additional_form_2 }} 
<input type="submit" value="Submit!"> 
</form> 

. JavaScript를 사용하여 편집 피드백이나 추가 기능을 추가 할 수 있습니다 (예 : 사용자가 특정 필드에 대해 특정 값을 선택하면 값 채우기). 백 엔드에서

, 당신은 다음 양식의 각이 유효한지 여부를 확인할 수 있습니다

if (main_form.is_valid() and 
    additional_form_1.is_valid() and 
    additional_form_2.is_valid()): 
    pass 

그렇지 않다면, 당신은 다시 양식 페이지의 오류를 표시 할 수 있습니다.

+0

고맙지 만 모델을 만들고 편집하는 방법은 무엇입니까? 내가 먼저 추가 양식을 저장 한 다음 저장된 모델을 기본 양식으로 전달하여 "일반 관계"를 통해 모델을 묶어야합니다. – Deadly

+0

@Deadly : 왜 모델을 다시 양식에 전달 하시겠습니까? 세 가지 양식의 정보가 모두 유효하고 백엔드에서 올바른 저장 작업을 수행 할 수 있습니다 (if 문 다음에'pass'가있는 곳). –

+0

'MainForm'을 저장하기 때문에'object_id' 필드를 알아야합니다. 추가 모델을 저장 한 후에 만 ​​알 수 있습니다 (pk). 그리고 또 다른 문제가 있습니다 :'MainForm'은 항상 유효하지 않습니다.'object_id' 필드는 추가 모델을 저장하기 전에 알려지지 않았기 때문에,'MainForm.fields' 튜플에 필요하기 때문에'MainForm.save' 메소드가 올바르게 작동합니다. 질문에보기 코드를 추가하고 MainForm 클래스를 편집했습니다. – Deadly