2017-05-04 64 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项目链接到我的回购。