2010-02-05 2 views
3

양식 클래스 내에서 인증 된 사용자에게 액세스를 시도하고 있습니다. 나는 요청 객체를 view 클래스에서 init 클래스로 넘겨 주었지만, 그것은보기 흉한 것처럼 보였다. 보기 외부에서 인증 된 사용자 또는 요청 개체에 액세스하는 더 좋은 방법이 있습니까? 이것이 내가 개인적으로보기에서 폼에 사용자를 통과하는 것을 선호 작동하지만 http://code.djangoproject.com/wiki/CookBookThreadlocalsAndUser보기 외부에서 인증 된 사용자에게 액세스

:

class LicenseForm(forms.Form): 
    '''def __init__(self, *args, **kwargs): 
    #self.fields['license'] = forms.ModelChoiceField(queryset=self.license_queryset(), empty_label='None', widget=forms.RadioSelect())''' 

    def license_queryset(): 
     queryset = License.objects.filter(organization__isnull=True) 
     # add addtional filters if the logged in user belongs to an organization 
     return queryset 

    licenses = forms.ModelChoiceField(queryset=license_queryset(), empty_label='None', widget=forms.RadioSelect()) 

답변

2

예를 여기에 지시하고, 그것을 할 수 있습니다. 이것은 해킹처럼 느껴지지 않습니다.

코드를 표시 할 수도 있습니다. 어쩌면 개선 될 수도 있습니다. 왜 사용자가 양식에 액세스해야합니까?

업데이트 : 당신은 같은 것을 할 수 있습니다 :이 이럴

class LicenseForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     super(LicenseForm, self).__init__(*args, **kwargs) 
     self._user = kwargs.get('user',None) 
     self.fields['licenses'] = forms.ModelChoiceField(queryset=self.license_queryset(), empty_label='None', widget=forms.RadioSelect()) 

    def license_queryset(self): 
     queryset = License.objects.filter(organization__isnull=True) 
     if self._user and self._user.belongsTo('SomeOrganization'): 
      queryset = queryset.filter(whatever='fits') 
     return queryset 

지역 스레드 장난으로 훨씬 청소기 방법입니다.

+0

내가 작업중인 코드를 표시하기 위해 내 원래 게시물을 편집했습니다. 따라서 license_queryset 메서드에서 인증 된 사용자 연결에 따라 몇 가지 추가 필터를 추가하고 싶습니다. 주석 처리 된 __init__은 뷰에서 요청 객체를 받아 들일 곳입니다. – CrashRoX

+0

당신의 권리, 그것은 더 깨끗해 보입니다. 모든 도움에 감사드립니다. 이전에 동일한 코드 접근법을 사용했지만 license_queryset 내에서 자체 액세스가 가능하다는 문제에 부딪 혔습니다. init을 통해 동적으로 라이센스 양식 필드를 만들어야 만했습니다. license_queryset에 자체 범위가 있고 라이센스 형식 선언에서 여전히 호출 할 수있는 방법이 있습니까? 이것이 새로운 질문 인 경우 죄송합니다. 그냥 장고와 파이썬을 시작하는 것입니다 :) – CrashRoX

+0

@CrashRoX : 당신 말이 맞아요, 나는 중요한 점을 잊어 버렸습니다. 그것을 바꿨습니다. 클래스 메쏘드를 정의 할 때 적어도 하나의 매개 변수를 제공해야합니다 (편의상'self'라고 함). 나중에 함수를 호출하면 전달할 필요가 없으며 자동으로 수행됩니다. 이것은 당신이 그것에 들어가는 것을 도울 것입니다 : http://docs.python.org/tutorial/classes.html –

관련 문제