2016-06-07 5 views
0

CreateView 유형의보기를 생성하려고합니다. 이보기에는 내가 만든 일부 필드가 제외 된 form_class = CourseForm이 표시됩니다. instructor 필드는 foriegnKey이며 사용자가 양식에서 제어 할 수 없도록하고 싶습니다. 로그인 한 사용자에 따라 달라지는 필드입니다.Django : CreateView에서 ForiegnKey의 초기 값을 설정하십시오.

# forms.py 
class CourseForm(forms.ModelForm): 
    class Meta: 
     model = Course 
     exclude = ['instructor', 'members', 'slug'] 
    # ... 

내보기는 다음과 같습니다. 나는

# views.py 

@method_decorator(login_required, name='dispatch') 
class CourseCreateView(CreateView): 
    model = Course 
    template_name = 'course_form.html' 
    success_url = reverse_lazy('course-create-complete') 

    form_class = CourseForm 

    def get_initial(self): 
     initial = super(CourseCreateView, self).get_initial() 
     initial = initial.copy() 
     profile = get_object_or_404(Profile, user__username=self.request.user) 
     initial['instructor'] = profile 
     return initial 


# models.py 

class Course(models.Model): 
    instructor = models.ForeignKey(Profile, related_name="Instructor") 
    # ... other fields 

를 제출하지만 probelm 인 경우 initial에서 강사 값을 포함하여 프로파일 인스턴스를 전달 것이라고 생각하는 나는 다음과 같은 오류 얻을 형태로 제출 될 때마다 :

NOT NULL constraint failed: myapp_course.instructor_id

답변

1

당신이 만약을 instructor 필드의 초기 값을 설정하려면 해당 값을 폼에서 제외하면 안됩니다. 대신에 필드를 숨길 수 있습니다.

아니면 exclude 목록에서 해당있을 수 있습니다,하지만 당신은 get_initial 메소드를 오버라이드 (override)하지 않습니다 만, 수동으로 할당 할 : 약 what does save(commit=False) do.

은 또한 장고 문서를 확인

class CourseCreateView(CreateView): 
    def form_valid(self, form): 
     self.object = form.save(commit=False) 
     # create instructor based on self.request.user 
     self.object.instructor = instructor 
     self.object.save() 
    return HttpResponseRedirect(self.get_success_url()) 

확인 장고 문서를 약 form_valid 함수와 how forms are handled in class based views.

+0

이 경우에는 제외하는 것이 더 좋은 해결책이라고 생각합니다. 그렇지 않으면 사용자 입력의 유효성을 검사해야합니다. 따라서 두 번째 해결 방법이 훨씬 더 좋습니다. –

+0

... 그러나 나는 강사를 저장하기 위해 다시 작성할 수 있다고 생각한다. (그리고 나서'super (...)'를 반환한다.) –