2012-12-09 3 views
2

다른 클래스의 추상 부모 클래스 인이 클래스를 가지고 있는데, ActivityModel (일종의 최신 활동 또는 그 객체에 대한 변경)을 호출하고 개체를 저장할 때마다 save 메서드를 재정 의하여 다른 인수를 사용하여 다음과 같이 정의하려고합니다. 나는이 두 번째 필드를 필요로하는 저장 방법을 변경했기 때문에 내가 ModelForms을 사용할 수 없습니다이 클래스를 상속 할오버런 된 저장을 사용하여 추상 모델 용 Django ModelForm 확장하기

class ActivityModel(models.Model): 
    last_updated = models.DateTimeField(auto_now=True) 
    updater = models.ForeignKey(UserProfile) 
    change = models.CharField(max_length=255) 

    def save(self, updater, change, *args, **kwargs): 
     self.updater = updater 
     self.change = change 
     super(ActivityModel, self).save(*args, **kwargs) 

    class Meta: 
     abstract = True 

하지만 지금은 모든 모델합니다 (사용자 프로필은 모든 시간을 제공해야 인증 된 사용자에 해당 그것은 저장됩니다) 그래서 그것은 새로운 ParentModel.save 메서드를 호출하고 그것에 제공된 현재 로그인 한 사용자를 채울 수 있도록 Save 메서드를 재정 의하여 ModelForm 클래스를 서브 클래 싱 할 수 있는지 궁금 해서요. 나는 단지 폼 init에 UserProfile을 제공 할 수 있다고 생각하지만, 큰 질문은 ModelForm 클래스를 서브 클래스 화하고 ParentModelForm 클래스를 생성 할 수 있는지를 ParentModel의 자식 클래스 각각에 대해 서브 클래 싱 할 수 있는지 여부입니다. 이것이 가능합니까? 그렇다면 어떻게해야할까요?

모든 도움을 주시면 대단히 감사하겠습니다. 시간 내 줘서 고마워!

+0

더 구체적으로 말씀해 주시겠습니까? 나는 당신의 질문을 이해하지 못했습니다. 어쩌면 우리에게 당신의 진짜 부모 클래스와 어떤 아이 클래스를 주면 우리는 당신에게 대답을 줄 수 있습니다. 나는 당신이 존재해서는 안되는 상속을 강요하려고 노력하고 있다고 생각하지만, 우리가 당신에게 준 데이터를 가지고 그것을 이해할 수는 없다. ... – marianobianchi

+0

나는 더 많은 관련 예제로 그것을 명확히하려고 노력했다. 이게 도움이 되나요? – hkothari

+1

확인. 대신에이 같은 일을 : 'an_activity.save (갱신, 변경)' 왜 당신은이 작업을 수행하지 않습니다 1)'an_activity.updater = 2)'an_activity.change = change' updater')'an_activity.save()' \t 아마도 질문해야 할 첫 번째 질문은 : 왜 저장 방법을 변경 하시겠습니까? – marianobianchi

답변

4

ModelForm은 다른 클래스와 비슷한 동작을하는 파이썬 클래스이기도합니다.

#Inherits from ModelForm class 
class ParentModelForm(forms.ModelForm): 
... 
... 
    def save(self, *args, **kwargs): 
    ... 
    ... 
#Inherits from ParentModelForm 
class ChildModelForm(ParentModelForm): 
.. 
.. 
    #You would have to override the Meta class 
    class Meta: 
     model = Child 
    def save(self, *args, **kwargs): 
     #Calling the parent model form save method 
     super(ChildModelForm, self).save(*args, **kwargs)