2011-04-26 3 views
22

그래서 나는 모델이 포함되어있는 것을 :장고에 FK 필드를 설정하기 위해 일반적인보기 CreateView를 기반

class Place(models.Model): 
    .... 
    created_by = models.ForeignKey(User) 

내보기과 같이이다 :

class PlaceFormView(CreateView): 
    form_class = PlaceForm 

    @method_decorator(login_required) 
    def dispatch(self, *args, **kwargs): 
     return super(PlaceFormView, self).dispatch(*args, **kwargs) 

인가 거기에 내가 request.user에 액세스하고 그 사용자에게 created_by를 설정할 수있는 방법이 있습니까? 나는 문서를 살펴 봤지만 이것에 대한 어떤 힌트도 찾을 수없는 것 같습니다.

`

답변

22

어떻게 양식 절약을 수행 form_valid을 무시 어떻습니까? 직접 저장하고 원하는대로 수행 한 다음 리디렉션하십시오.

class PlaceForm(forms.ModelForm): 
    ... 
    ... 
    ... 

    def __init__(self, *args, **kwargs): 
     self.created_by = kwargs['initial']['created_by'] 
     super(PlaceForm, self).__init__(*args, **kwargs) 

    def save(self, commit=True): 
     obj = super(PlaceForm, self).save(False) 
     obj.created_by = self.created_by 
     commit and obj.save() 
     return obj 

class PlaceFormView(CreateView): 
    ... 
    ... 
    form_class = PlaceForm 

    def get_initial(self): 
     self.initial.update({ 'created_by': self.request.user }) 
     return self.initial 

이 :

class PlaceFormView(CreateView): 
    form_class = PlaceForm 

    @method_decorator(login_required) 
    def dispatch(self, *args, **kwargs): 
     return super(PlaceFormView, self).dispatch(*args, **kwargs) 

    def form_valid(self, form): 
     obj = form.save(commit=False) 
     obj.created_by = self.request.user 
     obj.save()   
     return http.HttpResponseRedirect(self.get_success_url()) 
+0

고마워요! 이것은 리디렉션을 제외하고는 작동합니다. 리디렉션 할 URL이 없습니다. URL을 제공하거나 모델에서 get_absolute_url 메소드를 정의하십시오. "라는 오류가 나타납니다. 그러나 모델에 get_absolute_url()이 설정되어 있고이 뷰가 처음에는 양식의 선택 상자와 함께 작동 할 때 제대로 리디렉션되었습니다. 지금 이것을 알아 내려고 노력 중입니다. 어떤 아이디어? – Brian

+1

예, get_absolute_url이 self.object에서 가져온 것처럼 보입니다 - 그래서 코드에서'form_valid'에'self.object = obj'를 설정하십시오 –

+0

다시 한번 감사드립니다. 알았어. – Brian

2

이 작업을 수행하는 또 다른 방법은 사용자를 저장하기 위해 CreateView에 get_initial() 메소드를 덮어을 통해 사용자를 통과하고 PlaceForm 클래스의 방법을 저장 수정하는 것입니다 저장 로직은 여전히 ​​폼 클래스 내에 캡슐화된다.

+0

사용자가 데이터베이스의 필수 필드 인 경우 작동하지 않음 – AmiNadimi

8

내가이 있지만,이 문제와 다른 사람들을 위해, 옛 것을 알고 :

더 간단한 방법이 있습니다

- 여러 번 항상 같은 모델의 인스턴스를 사용하는 양식을 저장하기 때문에, 당신은 또한 수행 할 수 있습니다

def form_valid(self, form): 
    obj = form.save(commit=False) 
    obj.created_by = self.request.user 
    return super(PlaceFormView, self).form_valid(form) 

그런 식으로 수퍼 콜의 모든 이점을 얻을 수 있습니다. 실제로 두 줄의 코드 만 추가하는 것은 쉽지 않으며 리디렉션 논리를 복제하여 반복 할 필요가 없습니다. .