2010-07-05 3 views
2

나는 장고에 여러 개의 "모듈"(각각 장고 앱)이있는 간단한 CMS를 만들고 있습니다. 내가 FooPage의 서브 클래스를 만들고, 각 모듈에서Django 상속 및 퍼미크트

class FooObject(models.Model): 
    id = models.SlugField(primary_key=True) 
    name = models.CharField(max_length=255) 
    creator = models.ForeignKey(auth.models.User, editable=False, related_name="createdby") 

class FooPage(FooObject): 
    content = models.TextField(blank=True, null=True) 

    @models.permalink 
    def get_absolute_url(self): 
     return ('page',(), {'page_id':self.id} 

class FooSubitem(FooObject): 
    parent = models.ForeignKey(FooPage, related_name='subitems') 

및 FooSubitem, 예를 들어, 적어도 하나 개의 서브 클래스 : 나는 다음과 같은 모델을 설정 한

# in FooBlog.models 
class FooBlog(FooPage): 
    owner = models.ForeignKey(auth.models.User, editable=False) 

    @models.permalink 
    def get_absolute_url(self): 
     return ('blog',(), {'blog_id':self.id}) 

class FooPost(FooSubitem): 
    post_time = models.DateTimeField(auto_now_add=True) 

# in FooGallery.models 
class FooGallery(FooPage): 
    location = models.CharField(max_length=255) 

    @models.permalink 
    def get_absolute_url(self): 
     return ('gallery',(), {'gallery_id':self.id}) 

class FooImage(FooSubitem): 
    image_file = models.ImageField(upload_to='foogallery') 

은 단순화,하지만 당신에게 내가 할 노력하고있어 좋은 아이디어를 줄 것이다. FooPost 및 FooImage 관리자는 상위 선택 목록을 해당 상위 페이지로 제한합니다.

템플릿에서 사용하려고하면 문제가 발생합니다. 모두 FooBlog 및 FooGallery 유형의 모든 FooPages의 목록을 반환

page_list = FooPage.objects.all() 

: 각각의 관점에서, 나는 다음 있습니다. 그러나, 나는이 목록을 반복 할 때 :

{% for page in page_list %}{{ page.get_absolute_url }}{% endfor %} 

는 '페이지'URL 패턴을 반환하지 않는 '블로그'또는 '갤러리'URL 패턴을.

나중에 FooCalendar 모듈을 추가 할 때 코드를 다시 작성하지 않고이 작업을 수행하려면 어떻게해야합니까? 가능한 모든 모듈과 함께 작동하는지 확인하고 싶습니다.

감사합니다,

  • Lexo 유형 FooPage의 모든 개체
+1

그것이 URL을 반환하는 서브 클래스 기능을 사용하지 않는 이상한 (그것은 반환을 수행하면 검색어 세트에 .select_subclasses를 호출하는 경우

그런 다음, 그것은 예를 들어, 모든 개체를 다운 캐스트합니다 FooBlog와 FooGallery를 목록에 넣으십시오.) 아마'FooBlog'와'FooGallery' 클래스를 프록시 모델로 설정해야 할 수도 있습니다.프록시 모델은 모델에 대해 동일한 데이터베이스를 유지할 때 사용되지만 순서와 같은 것들을 조정하고, 아마도'get_absolute_url' 기능을 사용하려고합니다. 체크 아웃하십시오 : http://docs.djangoproject.com/ko/1.2/topics/db/models/#id8 - 그게 효과가 있는지 알려주십시오. – Bartek

+0

정보 주셔서 감사합니다. 프록시 모델을 살펴 보겠습니다. – Lexo

+0

프록시 모델이 필요하다고 생각하지 않습니다. FooImage와 같은 개별 하위 클래스에는 추가 필드가 있어야합니다. 추상 클래스는 완벽하지만 FooPages와 FooSubitems 사이에 부모/자식 관계가 있어야하며 추상 클래스에 외래 키를 지정할 수 없습니다. – Lexo

답변

0

FooPage.objects.all() 반환, 이러한 개체는 FooPage, FooBlog, FooGallery에 대한 기본 DB 테이블 행의 혼합 될 것입니다. 올바른 URL을 얻으려면 FooBlog 또는 FooGallery 객체를 가져와야합니다. 예 : 페이지는 단순히 FooPage 통해 생성 된 페이지의 객체, 즉 경우

page.fooblog.get_absolute_url() 

그것은 다른 방법이 FooPage a를 만들기 위해 노력하고 있습니다 그래서 당신이

urls = [] 
    for page in FooPage.objects.all(): 
     try: 
      page = page.fooblog 
     except FooBlog.DoesNotExist: 
      pass 

      urls.append(page.get_absolute_url()) 

같은 것을 할 수있다 정확한 URL을 얻을, FooBlog.DoesNotExist 오류가 발생 할 수 있습니다 FooPage가 실제 테이블이되기를 원하지 않는다면 abstractclass.

+0

감사합니다. Anurag. 내 문제는 내가 설치할 모듈 앱 (예 : FooBlog, FooGallery)을 모르거나 나중에 설치할 수 있다는 것입니다. 10 가지 이상의 다른 앱을 만드는 경우 (전적으로 가능함) FooPage의 각 유형에 대한 체크를 포함하도록 코드를 다시 작성하고 싶지 않습니다. 게다가, 그것은 매우 비효율적이며 프로그램 적으로 할 수 있어야하는 것으로 보인다. 가장 구체적인 하위 클래스로 "드릴 다운"할 수있는 방법이 있습니까? – Lexo

+0

또한 추상 클래스를 사용하려고했지만 FooSubitems가 FooPage 부모를 가져야하고 추상 클래스에 외래 키를 지정할 수 없으므로 작동하지 않습니다. – Lexo

+0

같은 일을하는 일반적인 함수를 작성할 수 있습니다. 즉 가능한 경우 파생 클래스 객체를 얻으려고 시도합니다. 사용자 정의 모델 관리자를 사용하여이를 수행 할 수 있습니다 (http://www.djangoproject.com/documentation/models/custom_managers). /) –

1

django-model-utils의 InheritanceManager를 사용하여 콘텐츠 형식 필드를 추가하지 않아도됩니다.

FooPage.objects.select_subclasses().all()