2010-06-14 6 views
0

Admin 인터페이스를 사용할 때 내 모델 관리자가 올바르게 작동하는 데 문제가 있습니다. 기본적으로, 나는 두 가지 모델이 있습니다Django 모델 관리자 use_for_related_fields 및 ModelAdmin 관계

class Employee(models.Model): 
    objects = models.EmployeeManager() 
    username = models.CharField(max_length=45, primary_key=True) 
    . . . 

class Eotm(models.Model): #Employee of the Month 
    date = models.DateField() 
    employee = models.ForeignKey(Employee) 
    . . . 

을 그리고,이 같은 뭔가 get() 방법을 겹쳐 EmployeeManager 클래스가 :

class EmployeeManager(models.Manager): 
    use_for_related_fields = True 

    def get(self, *arguments, **keywords): 
     try: 
      return super(EmployeeManager, self).get(*arguments, **keywords) 
     except self.model.DoesNotExist: 
      #If there is no Employee matching query, try an LDAP lookup and create 
      #a model instance for the result, if there is one. 

기본적으로, 아이디어는 자동에서 생성 Employee 개체가하는 것입니다 Active Directory의 정보가 아직 데이터베이스에없는 경우 이것은 내 응용 프로그램 코드에서 잘 작동하지만, Eotm 모델의 Django 관리 페이지를 만들려고 할 때 상황이 좋지 않았습니다. ForeignKey 필드의 기본 위젯을 TextInput 위젯으로 대체하여 사용자가 사용자 이름을 입력 할 수 있도록했습니다 (username이 기본 키이기 때문에). 이론 상으로는 EmployeeManager.get(username='whatever')을 호출해야하는데 이는 기본 관리자와 마찬가지로 Employee을 반환하거나 생성자가없는 경우이를 반환합니다. 문제는 내 매니저가 사용되지 않는다는 것입니다.

generic manager documentation을 제외하고 Django 설명서에서 사용자 정의 Manager 클래스와 관리 사이트를 사용하는 것에 관해서는 아무것도 찾을 수 없습니다. 내가 ModelAdmin 클래스에 대한 사용자 지정 관리자를 지정하는 것에 대해 이야기 한 blog entry을 찾았지만 ModelAdmin 클래스에 의해 표현 된 모델을 변경하고 싶지는 않지만 실제로 도움이되지는 않습니다. 그러나 관련된 것은 하나입니다.

+0

관련없는 참고 사항 : EmployeeManager에서 get의 동작을 재정의하는 것은 좋지 않습니다. 대신 get_or_create 함수를 재정의합니다. 그것은 당신이 여기서 말하는 것과 정확히 같습니다. 정확한 레코드를 얻고 싶지만 존재하지 않는 레코드를 반드시 생성하고 싶지 않은 경우가있을 수 있습니다. 'emp, created = Employee.objects.get_or_create (username = 'johndoe')'와 같이 자동 생성을 원하는 곳에서는 get_or_create를 호출 할 수 있습니다. 그냥 객체 *와 *'True' (처음부터 생성 된 경우) 또는'False' (이미 존재한다면)를 반환하는지 확인하십시오. –

+0

나는'get_or_create' 메소드를'Employee' 객체를 생성 할 수 있음을 암시하고 싶지 않기 때문에 사용하지 않았습니다. 나는 또한'Employee' 모델이 다른 모델과 똑같이 행동하기를 원하지만 데이터베이스 대신 디렉토리에서 정보를 가져오고 싶습니다. – AdmiralNemo

+0

그래서 기본적으로 세 가지 시나리오가 있습니다. 1) 직원 레코드가 존재합니다. 2) 존재하지 않는다; 또는 3) 존재하지 않으며 일치하는 LDAP 레코드가 존재하지 않으므로 새로운 직원을 만들지 마십시오. 100 % 확실하지 않으면'get'을 사용하는 것이 좋습니다. 'get'을 호출 할 때 가능한 부작용 (직원 레코드 생성) –

답변

0

난 당신이 여기에 뭘 하려는지 이해되지 않을 수 있습니다,하지만 당신은 당신의 Eotm 모델에 대한 사용자 지정 양식을 사용할 수 이론적으로 작동합니다, 그건

#admin.py 
from forms import EotmAdminForm 

class EotmAdmin(models.ModelAdmin): 
    form = EotmAdminForm 


#forms.py 
from django import forms 
from models import Eotm, Employee 

class EotmAdminForm(forms.ModelForm) 
    class Meta: 
     model = Eotm 

    def clean_employee(self): 
     username = self.cleaned_data['employee'] 
     return Employee.get(username=username) 

. 나는 그것을 시험하지 않았다.

+0

시도했지만'clean_employee' 메서드가 호출되지 않았습니다. 테스트로'foo' 필드를 추가하고 호출 된 clean_foo 메서드를 만들었습니다. – AdmiralNemo

+0

그래, 만약 내가 th의'employee' 속성을 수동으로 지정하십시오 e'EotmAdminForm'을 자동으로 추가하는 대신. 당신의 도움을 주셔서 감사합니다. – AdmiralNemo

관련 문제