2016-08-02 6 views
4

これは、テキストの上に表示されるアイコンのモデルで、名前とアイコンが表示されます。Wagtail、ChoiceBlockの選択肢を別のモデルから取り込むにはどうすればよいですか?

from django.db import models 
from django.utils.translation import ugettext as _ 
from django.conf import settings 


class SomeSortOfIcon(models.Model): 

    name = models.CharField(max_length=200, 
          verbose_name=_('Icon Name'), 
          help_text=_('This value will be shown to the user.')) 

    image = models.ForeignKey(
     getattr(settings, 'WAGTAILIMAGES_IMAGE_MODEL', 'wagtailimages.Image'), 
     on_delete=models.PROTECT, 
     related_name='+', 
     verbose_name=_('Icon'), 
    ) 

    def __str__(self): 
     return self.name 

    class Meta: 
     verbose_name = _('Icon') 
     verbose_name_plural = _('Icons') 

これは、ページ上のストリームフィールドに追加されるブロックのコードです。

from django.db import models 
from django import forms 
from django.utils.translation import ugettext as _ 

from wagtail.wagtailcore import blocks 

from xxx.models import SomeSortOfIcon 


class SomeSortOfIconChooserBlock(blocks.ChoiceBlock): 
    ## PROBLEM HERE, where do I get the choices from? 
    choices = tuple([(element.name, element.image) for element in SomeSortOfIcon.objects.all()]) 
    target_model = SomeSortOfIcon 


class SomeBox(blocks.StructBlock): 

    headline = blocks.TextBlock(required=True) 

    some_icon = SomeSortOfIconChooserBlock(label='Icon', required=True) 

    info_box_content = blocks.RichTextBlock(label='Content', required=True) 

    class Meta: 
     template = 'blocks/some_box.html' 
     icon = 'form' 
     label = _('Some Box') 

だから、私はブロックがstreamfieldに、私はアイコンモデルから選択してドロップダウンメニューをしたいアイコンの追加入手できますか。名前を表示することになっています。名前を選択すると、htmlに名前で自動的に追加されます。

ドロップダウンメニューが表示されますが、空です。 choices属性を使用しようとしましたが、他のモデルに接続する方法がわかりません。

誰でもお手伝いできますか?大変感謝しています。

答えて

3

これは、ChooserBlockから継承することで可能です。

class SomeSortOfIconChooserBlock(blocks.ChooserBlock): 
    target_model = SomeSortOfIcon 
    widget = forms.Select 

    class Meta: 
     icon = "icon" 

    # Return the key value for the select field 
    def value_for_form(self, value): 
     if isinstance(value, self.target_model): 
      return value.pk 
     else: 
      return value 

とあなたのブロックでちょうどこれがあなたにダウンSomeSortOfIconモデルのオブジェクトに基づいて、ドロップを与える

class SomeBox(blocks.StructBlock): 
    headline = blocks.TextBlock(required=True) 
    some_icon = SomeSortOfIconChooserBlock(required=True) 
    info_box_content = blocks.RichTextBlock(label='Content', required=True) 

    class Meta: 
     template = 'blocks/some_box.html' 
     icon = 'form' 
     label = _('Some Box') 

を使用しています。

関連する問題