2017-12-24 14 views
0

http://docs.wagtail.io/en/v1.13.1/getting_started/tutorial.htmlセキレイジェネリックギャラリー実装と

チュートリアルイントロにブログギャラリー機能をgetting_startedセキレイOneToOneField、以下のように実装されています。

class BlogPage(Page): 
    ... 

class BlogPageGalleryImage(Orderable) 
    page = ParentalKey(BlogPage, related_name='gallery_images') 
    image = ... 

この方法ではBlogPageモデルで、しかしBlogPageGalleryImageカップルに動作します。私の意図は、任意のモデル(ページ)に組み込むことができる一般的なギャラリーモデルを作ることです。その後のコードで、私たちはblog.gallery.imagesを経由して画像を得ることができます

class BlogPage(Page): 
    gallery = models.OneToOneField(Gallery, on_delete=models.SET_NULL, null=True) 
    ... 

class Gallery(Page): 
    pass 

class GalleryImage(Orderable): 
    gallery = ParentalKey(Gallery, related_name='images') 

:アイデアは、中間ギャラリーのモデルを使用しています。

私の質問は、ブログページオブジェクトを編集するときに、ギャラリーオブジェクト(OneToOneField)をインラインで作成/編集するためのwagtail管理インターフェイスで動作するようにする方法です。

答えて

1

これを行う方法の1つは、特定のBlogPageモデルではなく、ページモデルとの関連で、Page-Image接続のより一般的な関係を使用することです。

これは、どのページにもギャラリー画像があることを意味し、フィールドをコンテンツパネルにInlinePanelで公開するだけです。

また、Mixinクラスを作成して、便利なメソッドを毎回書き直すことなく利用できるようにすることもできます。ここで

は一例です。

from django.db import models 

from wagtail.admin.edit_handlers import InlinePanel 
from wagtail.core.models import Orderable, Page 
from wagtail.images.edit_handlers import ImageChooserPanel 

class ImageGalleryRelationship(Orderable, models.Model): 
    """ Relationship between any `Page` and `Image` for an image gallery.""" 
    page = ParentalKey(Page, related_name='gallery_page') 
    image = models.ForeignKey('wagtailimages.Image', related_name='gallery_image') 
    panels = [ImageChooserPanel('image')] 


class PageGalleryMixin(): 
    def gallery_images(self): 
     images = [g.image for g in self.gallery_page.all()] 
     return images 

class BlogPage(Page, PageGalleryMixin): 
    # all page fields, gallery does not need to be defined here 
    content_panels = Page.content_panels + [ 
     InlinePanel('gallery_page', label='Image Gallery'), 
     #... 
    ] 

注:これはInlinePanelはParentalKey関係を必要とし、OneToOne接続ではありません。このソリューションでは、実際の「ギャラリー」モデルは注文可能な関係のセットではありません。

+0

OOのアプローチは、ギャレーが1つだけに限定された1ページで動作します。 –

+0

聞いてうれしいです。 –

関連する問題