2011-07-17 6 views
1

I는 다음과 같습니다 Domain라는 이름의 모델이있다. 이 모델에는 사용자 입력이 필요한 필드가 하나 있지만 외부 키 필드에는 사용자 입력이 필요하지 않습니다. 내 일반보기에서 생성되지만 현재 인증 된 사용자의 값을 할당하는 양식에서 해당 필드를 제외하려면 어떻게해야합니까?제외 필드

감사합니다.

답변

2

이번 주 초에 django-users group에서 유사한 질문에 대한 Russel의 대답을 살펴보십시오.

응답 *을 인용 :

양식 및보기가 다른 문제를 해결.

보기에서는 "이 요청을 어떻게 처리하고 응답으로 변환합니까?"라는 문제를 해결하고 있습니다. " Form은 " 이 요청의 POST 데이터를 모델 객체로 변환하는 방법 (또는 모델 객체로 변경)"문제를 해결하고 있습니다.

은 매우 약, 뷰가하고있는 다음

  1. 보기
  2. 보기 이것은 POST가보기 양식을 요청의 경우 GET 또는 POST
  3. 입니다 여부를 작동하는 요청을 받으면 게시물을 모델 변경으로 바꾸기
  4. 양식 성공 또는 실패를 반환합니다.
  5. 보기 양식의 성공 또는 실패에 대한 응답입니다.
  6. 보기는 응답을 반환합니다.

양식의 기능은보기의 기능의 전체 하위 집합입니다 - 이런 이유로, 그것은 완전히 상호 교환 내부 구성 요소입니다.

뷰 양식에 대한 모든 기본값을 추측하기 이제, 간단한 상황에서, 그것은 가능 -이 알아야 할 모든 당신이 푸 모델 을 상대하고, 그것을 기본 푸를 구성 할 수 있다는 것입니다 ModelForm. 그러나보다 정교한 양식 요구 사항이있는 경우 사용자 정의 양식이 필요합니다.

은 View 클래스의 모든 옵션을 표시하여 구현할 수 있습니다. 하지만 모든 것을 깨끗하게 유지하기 위해 은 ModelForm을 격리 된 상태로 유지하고 어떤 형식 클래스를 사용할지 지정하기 위해보기를 에 제공했습니다.

class CampaignForm(forms.ModelForm): 


    class Meta: 
     model = Campaign 
     exclude = ('user', 'name', 'content_inlined') 

class CreateCampaignView(CreateView): 
    form_class = CampaignForm 
    template_name = "forms/create.html" 

I를 -

그래서 필드를 제외의 사용 사례를 충당하기 위해, 당신은 필드를 제외하는 ModelForm을 정의, 다음 CreateView 사용하려는 양식을 알려주세요 "필드 값 수정"이라고 말하면 새 캠페인 인스턴스를 저장하기 전에 에 user, name 및 content_inlined 값을 설정한다는 의미입니다. 이 작업을 수행하려면 에 양식의 형태로 처리 로직을 몇 가지 추가 코드를 삽입해야합니다

class CreateCampaignView(CreateView): 
    form_class = CampaignForm 
    template_name = "forms/create.html" 

    def form_valid(self, form): 
     form.instance.user = ... (something meaningful.. e.g., self.request.user) 
     return super(CreateCampaignView, self).form_valid(form) 

이 양식이 유효 할 때 기본 동작을 무시하고 여분의 값을 설정합니다. form_valid()의 super() 구현은 인스턴스를 저장합니다.

레코드의 경우 ModelForm의 save() 메서드를 재정 의하여 수행 할 수도 있습니다.하지만 이렇게하면 요청 개체가 손실됩니다. 인스턴스 값을 요청에 민감한 것으로 설정하십시오.

* 원래 응답 집합은 form.instance.user 대신 self.object.user입니다. 이것은 AttributeError을 제공하므로 위에서 변경했습니다.