2011-04-18 4 views
18

은 사용자가 할 수있는 하나의 형태로 표시하는 것입니다 :Django의 ModelForm에 외래 키 필드를 추가하려면 어떻게해야합니까? 내가하고 싶은 무엇

  • 이 (Document 모델) 문서의 제목을 입력을
  • 선택 드롭 다운 목록에서 자신의 user_defined_code 선택 사항 중 하나 (인구 Code 모델에 저장된 unique_code에서 UserDefinedCode 모델)
  • 유형()

에 의해 나는 앞의 필드를 표시 대해 이동하는 방법을 잘 모르겠어요 양식에서 키 관계를 무시합니다. 뷰에서 document.code_set (예를 들어)을 사용하여 현재 document 오브젝트에 대한 관련 오브젝트에 액세스 할 수 있지만이를 ModelForm에 적용하는 방법을 모르겠습니다.

내 모델 :

class UserDefinedCode(models.Model): 
    name = models.CharField(max_length=8) 
    owner = models.ForeignKey(User) 

class Code(models.Model): 
    user_defined_code = models.ForeignKey(UserDefinedCode) 
    unique_code = models.CharField(max_length=15) 

class Document(models.Model): 
    title = models.CharField(blank=True, null=True, max_length=200) 
    code = models.ForeignKey(Code) 
    active = models.BooleanField(default=True) 

내 ModelForm

class DocumentForm(ModelForm): 
    class Meta: 
     model = Document 

답변

27

당신이 forms.ModelChoiceField를 사용하고 그것을 검색어 세트를 전달할 수있는 형태로 외래 키 필드를 표시에 관해서. 그래서

, forms.py :

class DocumentForm(forms.ModelForm): 
    class Meta: 
     model = Document 

    def __init__(self, *args, **kwargs): 
     user = kwargs.pop('user','') 
     super(DocumentForm, self).__init__(*args, **kwargs) 
     self.fields['user_defined_code']=forms.ModelChoiceField(queryset=UserDefinedCode.objects.filter(owner=user)) 

views.py : 귀하의 질문에서

def someview(request): 
    if request.method=='post': 
     form=DocumentForm(request.POST, user=request.user) 
     if form.is_valid(): 
      selected_user_defined_code = form.cleaned_data.get('user_defined_code') 
      #do stuff here 
    else: 
     form=DocumentForm(user=request.user) 

    context = { 'form':form, } 

    return render_to_response('sometemplate.html', context, 
     context_instance=RequestContext(request)) 

: 난 당신이 사용할 수있는보기 알고

document.code_set (예를 들어) 은 현재 문서 개체 인 에 대한 관련 개체에 액세스하지만 이 모델을 ModelForm에 적용하는 방법을 모르십니까?

실제로 Document 개체는 FK 관계가 문서 모델에 정의되어 있기 때문에 이 아닙니다. Code에 대한 many to one 관계를 정의하고 있습니다. 즉 Code 객체 당 많은 Document 개의 객체가있을 수 있습니다. Code 개체의 문자 수는 .document_set입니다. 문서 개체에서 할 수있는 것은 Codedocument.code을 사용하는 것과 관련된 액세스입니다.

편집 : 나는 이것이 당신이 찾고있는 것을 할 것이라고 생각합니다. (테스트되지 않은)

forms.py :

class DocumentForm(forms.ModelForm): 
    class Meta: 
     model = Document 
     exclude = ('code',) 

    def __init__(self, *args, **kwargs): 
     user = kwargs.pop('user','') 
     super(DocumentForm, self).__init__(*args, **kwargs) 
     self.fields['user_defined_code']=forms.ModelChoiceField(queryset=UserDefinedCode.objects.filter(owner=user)) 
     self.fields['unique_code']=forms.CharField(max_length=15) 

views.py :

def someview(request): 
    if request.method=='post': 
     form=DocumentForm(request.POST, user=request.user) 
     if form.is_valid(): 
      uniquecode = form.cleaned_data.get('unique_code') 
      user_defined_code = form.cleaned_data.get('user_defined_code') 
      doc_code = Code(user_defined_code=user_defined_code, code=uniquecode) 
      doc_code.save() 
      doc = form.save(commit=False) 
      doc.code = doc_code 
      doc.save() 
      return HttpResponse('success') 
    else: 
     form=DocumentForm(user=request.user) 

    context = { 'form':form, } 

    return render_to_response('sometemplate.html', context, 
     context_instance=RequestContext(request)) 

실제로 당신은 아마 대신의 코드 개체를 만들 때 get_or_create를 사용하고 싶습니다.

doc_code = Code(user_defined_code=user_defined_code, code=uniquecode) 
+0

도움 주셔서 감사합니다.ModelChoiceField에 대한 문서를 읽었으며 이제는 의미가 있습니다. 'unique_code' 필드에 대해 CharField (내 질문에 세 번째 글 머리 기호)를 어떻게 표시하는지 알고 있습니까? 필자는 모델을 약간 씩 훑어 읽기 쉽게 만들었지 만 기본적으로 컴퓨터에서 생성 된 고유 한 문서 코드가 할당 된 문서를 가지고 있습니다. 각 사용자는 자신이 소유 한 모든 문서의 접두어로 접두사로 첨부 된 별도의 사용자 코드를 만들 수 있습니다. 따라서 여러 모델에 대한 이유가 있습니다. –

+0

@Ben S 알았습니다. 내 게시물을 수정하겠습니다. – DTing

+0

이것은 훌륭했습니다. 당신의 도움을 주셔서 감사합니다. –

관련 문제