DJANGO <OPTION>элемент с ДОПОЛНИТЕЛЬНЫМИ АТРИБУТАМИ - PullRequest
0 голосов
/ 28 марта 2019

Как мы можем добавить дополнительные теги к элементу тега DJANGO FORM MODEL?Я все прочитал, попытался изменить что-то внутри form.py/class META / widgets, но без ничего.

class MySelect( forms.Select ):

    def __init__( self, attrs = None, choices = (), option_xtra_attr = '' ):
        self.option_xtra_attr = option_xtra_attr
        super( MySelect, self ).__init__( attrs, choices )

    def render_option( self, selected_choices, option_value, option_label, option_xtra_attr = '' ):
        if option_value is None:
            option_value = ''
        option_value = force_text( option_value )
        if option_value in selected_choices:
            selected_html = mark_safe( ' selected="selected"' )
            if not self.allow_multiple_selected:
                # Only allow for a single selection.
                selected_choices.remove( option_value )
        else:
            selected_html = ''
        return format_html( '<option value="{}"{}{}>{}</option>',
                            option_value,
                            selected_html,
                            option_xtra_attr,
                            force_text( option_label ) )




class MonitoringSpot_InLine_FORM( forms.ModelForm ):
    class Meta:
        model = MonitoringSpotClass

        fields = [ 'monitoringSpot_NODE_monitoringAreaType', ]

        widgets = {
                'monitoringSpot_NODE_monitoringAreaType': MySelect( option_xtra_attr = { 'xdata': 'value' } )
        }

1 Ответ

0 голосов
/ 29 марта 2019

работает лучше Класс OptionAttr (forms.Select):

    def __init__( self, *args, **kwargs ):
        self.src = kwargs.pop( 'attributes', { } )
        super().__init__( *args, **kwargs )

    def create_option( self, name, value, label, selected, index, subindex = None, attrs = None ):
        splitedLabel = label.split(",")
        options = super( OptionAttr, self ).create_option( name, value, label, selected, index, subindex = None, attrs = None )
        for k, v in self.src.items():
            if v != True:
                options[ 'attrs' ][ k ] = v
            else:
                options[ 'attrs' ][ k ] = splitedLabel[1:]; options[ 'label' ] = str(splitedLabel[0])
        return options

class MonitoringSpot_InLine_FORM( forms.ModelForm ):
    class Meta:
        model = MonitoringSpotClass

        fields = [ 'monitoringSpot_NODE_monitoringAreaType', ]

        widgets = {
                'monitoringSpot_NODE_monitoringAreaType': OptionAttr( attributes = { 'extra': True } )
        }

Если вы установите True в качестве дополнительного атрибута, этот код разделит все данные из LABEL на дополнительный тег. Или вы можете установить собственное значение.

...