2015-01-21 3 views
3

Im 내 사이트의 다양한 위치에서 사용하기 위해 모델에서 양식을 만드는 데 ModelForm을 사용합니다. 양식에는 사용자를 기준으로 필터링해야하는 외부 키 필드가 있습니다. 내보기에 다음Django ModelAdmin ModelForm에서 쿼리 집합을 가져옵니다.

class TestForm(ModelForm): 
    def __init__(self,user,*args,**kwargs): 
     super (TestForm,self).__init__(*args,**kwargs) # populates the post 
     self.fields['controller'].queryset = Controller.objects.filter(user=user) 

    class Meta: 
     model = Test 
     exclude = ['customer'] 

그리고를 사용 : 나는 성공적으로 사용했던이 장고 관리자 이외의 제 형태의 잘 작동 form = TestForm(user)

하지만, 내 사이트는 모델 장고 관리자 내에서 편집 할 수 있어야 역시. 그래서를 기반으로 내 ModelAdmin이 코드를 사용 Django Docs

class TestAdmin(admin.ModelAdmin): 
    def get_form(self, request, obj=None, **kwargs): 
     if request.user.is_superuser: 
      kwargs['form'] = SuTestForm 
     else: 
      kwargs['form'] = TestForm(request.user) 
     return super(TestAdmin, self).get_form(request, obj, **kwargs) 
나는이 그냥 그대로 내 다른 형태의 수행하지만 난 장고에서 다시이 오류를 얻고 작업을해야 생각

: invalid literal for int() with base 10: 'TestForm'

후 난을 googeling의 비트는 ModelAdmin 내부의 검색어 필터링을두고이 방법을 건너 온이 완벽하게 잘 작동하지만 매우 건조하지 않는 것 내 ModelForm의 여러 사본을 만들 저를 필요로 않습니다

form = super(TestAdmin, self).get_form(request, obj, **kwargs) 
form.base_fields['controller_fk'].queryset = Controller.objects.filter(custid=cust) 
return form 

. 그래서 나는 내 ModelForm queryset을 ModelAdmin 폼으로 반환하는 방법을 아는 사람이 있습니까?

+0

나는 무엇이 문제인지 (전체 스택 추적을 제공하지 않았기 때문에 어디에서 쿼리가 잘못되는지 알 수 없음) 그러나 get_form 메소드에서 직접 폼 인스턴스를 반환하고 어떤 일이 발생하는지 확인할 수 있습니까? ? – Serafeim

답변

2

문제는 사실 else 절에서 양식을 인스턴스화하는 반면, 다른 절은 인스턴스가 아닌 클래스를 반환한다는 점입니다. 두 분과는 반을 반납해야합니다.

불행히도 양식 인스턴스화에 추가 kwargs를 제공하는 쉬운 방법은 ModelAdmin 클래스에 없습니다.이 메서드는 changeform_view 메서드 내부 깊숙히 수행되며이 메서드는 재정의가 훨씬 어렵습니다. get_form에서 구운 사용자 값을 가진 클래스를 반환하려면 뭔가 똑똑해야합니다.

관련 문제