2

이 질문은 다음과 같이 공식화 될 수도 있습니다. "CreateView 생성 폼의 속성을 변경하는 방법"Django의 CreateView에서 양식 필드 사용 안 함

"CreateView"를 사용하여 장고 1.10에서보기 및 관련 양식을 생성하고 있습니다. 일반 사용자 (교사)는 모델의 인스턴스를 본인으로 만 만들 수 있지만 권한있는 사용자는 인스턴스를 만들고 교사에게 할당 할 수 있습니다. 두 가지 모두 동일한보기/양식을 사용하고 싶습니다.

모델 :

class Set(models.Model): 
    name = models.CharField(
     max_length=40, 
    ) 
    matter = models.ForeignKey(
     Matter, 
     on_delete=models.SET_NULL, 
     null=True, 
    ) 
    group = models.ForeignKey(
     Group, 
     on_delete=models.SET_NULL, 
     null=True, 
    ) 
    teacher = models.ForeignKey(
     Teacher, 
     on_delete=models.PROTECT, 
    ) 

기술적으로, 그것은 현재 로그인 "교사"로 양식을 채우기에 구성하고 현재 사용자가 권한이없는 한 필드를 비활성화합니다. 현재 다음 코드를 사용하여 초기 값 설정을 수행하지만 일반 사용자가 "선생"필드를 수정하지 못하게하는 방법을 모르겠습니다.

class SetCreate(LoginRequiredMixin, CreateView): 
    model = Set 
    fields = ('name', 'matter', 'group', 'teacher') 

    def get_initial(self): 
     return {'teacher': self.request.user.teacher.id} 

    # code to limit 'teacher' field editing 

해봤 또 다른 옵션은 같은 오른쪽 '교사'로 인스턴스를 생성하는 것입니다 :

class SetCreate(LoginRequiredMixin, CreateView): 
    model = Set 
    fields = ('name', 'matter', 'group') 

    def form_valid(self, form): 
     form.instance.teacher = self.request.user.teacher 
     return super(SetCreate, self).form_valid(form) 

그것은 좋은 작동하지만 내가 특권에 의해 '교사'필드를 편집하는 데 사용할 수 없습니다 사용자.

필드를 형성하는 'Field.disable'속성이 있다는 것을 알고 있지만 가능한 경우 'CreateView'생성 된 양식의 속성을 변경하는 방법을 알지 못합니다.

또 다른 옵션은 양식의 드롭 다운 목록에있는 옵션을 제한하는 것이지만 방법을 알지 못합니다.

다른 견해를 포함한 조언은 환영합니다.

답변

2

편집보기는 코드를보고 fields 속성 값을 기준으로 get_form_class 내에 양식을 생성합니다. 이는 클래스 속성으로 정의되지만 실제로 코드는 self.fields을 통해이를 참조하므로 인스턴스 수준에서 재정의 할 수 없습니다.

+0

좋은 보이는

class SetCreate(LoginRequiredMixin, CreateView): model = Set fields = ('name', 'matter', 'group') def get_form_class(self, *args, **kwargs): if self.request.user.has_the_right_permission(): self.fields += ('teacher',) else: self.fields = self.fields return super(SetCreate, self).get_form_kwargs(*args, **kwargs) 

, 그러나 그것은 단지 편집 양식에 유용하지 만들 것입니다 (겉보기 무의미 다른 블록은 우리가 항상 인스턴스 변수를 설정할 수 있도록하는 것입니다.) : 그래서, 당신이 할 수 형태. 생성 모드에서 일반 사용자는 실제로 '선생님'필드를 정의하지만 자신으로 만 정의 할 수 있습니다. 이상적으로는 양식이 생성 될 때 '선생님'입력란에 '사용 중지됨'속성을 설정하여 해결할 수 있지만이를 수행하기 위해 어떤 방법을 대체 할 것인지 알 수 없습니다. – jjchico

+0

위와 같이 표시된 'form_valid' 코드로 다시 한 번, 권한을 검사하는 if 블록 안에 다시 넣습니다. –