2017-05-04 33 views
0

我正在處理小冊子w block塊集成。StreamField:添加地圖塊

https://github.com/frague59/wagtail-leaflet

我和小部件的渲染困難時,我add新塊到流:沒有顯示。來自django-leaflet/django-geojson的窗口小部件涉及設置geojson參數'window wide',這並不反映在模板實例中。

在我leaflet/widget.html

<script type="text/javascript"> 
    {% block vars %}var {{ module }} = {}; 
    {{ module }}.fieldid = '{{ id_css }}'; 
    {{ module }}.modifiable = {{ modifiable|yesno:"true,false" }}; 
    {{ module }}.geom_type = '{{ geom_type }}'; 
    {{ module }}.srid = {{ map_srid }}; 
    {% endblock vars %} 
     function {{ id_map_callback }}(map, options) { 
     window.LEAFLET_DATA['{{ module }}'].store_class = {{ field_store_class }}; 
     (new {{ geometry_field_class}}(window.LEAFLET_DATA['{{ module }}'])).addTo(map); 
     {% block callback %}{% endblock callback %} 
    }; 

    {% if target_map %} 
     window.addEventListener('map:init', function (e) { 
      var target_map = e.detail.map; 
      target_map.on('map:loadfield', function (me) { 
       if (me.fieldid == 'id_{{ target_map }}') { 
        setTimeout(function() { 
         {{ id_map_callback }}(target_map, e.detail.options); 
        }, 0); 
       } 
      }); 
     }, false); 
    {% endif %} 
</script> 

text/template元素:

<script type="text/javascript"> 
    var geodjango___prefix___value = {}; 
    geodjango___prefix___value.fieldid = '__prefix__-value'; 
    geodjango___prefix___value.modifiable = true; 
    geodjango___prefix___value.geom_type = 'Geometry'; 
    geodjango___prefix___value.srid = 4326; 


    function __prefix___value_map_callback(map, options) { 
     geodjango___prefix___value.store_class = L.FieldStore; 
     (new L.GeometryField(geodjango___prefix___value)).addTo(map); 

    }; 

</script> 

的Streamfield塊API並沒有明確說明這個用例。

你有這種塊的工作塊的例子嗎?

謝謝!

+0

請提供[最小,完整且可驗證的](https://stackoverflow.com/help/mcve)代碼示例。 – gasman

+0

https://github.com/makinacorpus/django-leaflet/issues/189 – frague

+0

@gasman在我的倉庫 相關代碼: https://github.com/frague59/wagtail-leaflet這裏 – frague

回答

0

要求:

django-leaflet 
django-geosjon 
jsonfield 

塊定義:使用從Django的單張/ Django的geosjon單張小部件

class GeoJSONBlock(FieldBlock): 
    geom_type = 'POINT' 

    def __init__(self, required=True, help_text=None, max_length=None, min_length=None, **kwargs): 
     if self.geom_type is None: 
      raise NotImplemented('You are attempting to use ``GeoJSONBlock`` directly, which *WILL* not work !') 

     self.field = GeoJSONFormField(required=required, 
             help_text=help_text, 
             max_length=max_length, 
             min_length=min_length, 
             geom_type=self.geom_type) 
     super(GeoJSONBlock, self).__init__(**kwargs) 

    def render_form(self, value, prefix='', errors=None): 
     """ 
     Renders ``edit`` form 

     :param value: current value 
     :param prefix: prefix of the form item 
     :param errors: Validations errors 
     :returns: HTML Fragment 
     """ 
     logger.debug('MapBlock::render_form() value = %s', value) 
     rendered = super(GeoJSONBlock, self).render_form(value=value, prefix=prefix, errors=errors) 
     return rendered 

    def render(self, value, context=None): 
     """ 
     Renders the widget in the web site 

     :param value: current value 
     :param context: Additional render context 
     :returns: HTML Fragment 
     """ 
     logger.debug('MapBlock::render() value = %s', value) 
     rendered = super(GeoJSONBlock, self).render(value=value, context=context) 
     return rendered 

    @property 
    def media(self): 
     return forms.Media(
      js=['wagtailleaflet/leaflet_init.js', ] 
     ) 

    def js_initializer(self): 
     """ 
     JS function to launch on start'up 
     :returns: JS function name, from ``wagtailleaflet/leaflet_init.js`` 
     """ 
     output = 'drawMap' 
     logger.debug('MapBlock::js_initializer() output = %s', output) 
     return output 

     def html_declarations(self): 
      output = render_to_string('wagtailleaflet/leaflet_forms.html') 
      return output 

用法:

from wagtail.wagtailadmin.edit_handlers import StreamFieldPanel 
from wagtail.wagtailcore.fields import StreamField 
from wagtail.wagtailcore.models import Page 
from wagtail.wagtailcore import blocks 
from wagtailleaflet.blocks import GeoJSONPointBlock 

class DemoPage(Page): 
    """ 
    Simple demo page 
    """ 
    body = StreamField([('text', blocks.RichTextBlock()), 
         ('map', GeoJSONPointBlock()), ]) 

    content_panels = Page.content_panels + [StreamFieldPanel('body')] 

我發現,問題來自傳單的實施,該傳單使用slugify(將該ID設置爲較低)來創建id,它在block初始化時打破了sequence.js中的__PREFIX__替換。

重新生產有點複雜,這就是爲什麼我確實把演示w project項目鏈接到我的回購。