如何删除'选择' ModelChoiceField中item的属性?

时间:2016-10-12 18:30:21

标签: django django-forms

如果选项列表中的对象具有FK到父对象,则ModelChoiceField会在HTML中添加属性selected

如何\我在哪里可以删除这个'选择'属性,以获得选择列表?要提及的是,我需要删除仅选择的'属性,即值本身不应从选择列表中删除。我需要以某种方式从python端挂钩,而不是从HTML挂钩。我试图在form内的不同地方找到所需的属性,但没有运气。

有没有人知道Django代码的部分,其中检查选项列表中的对象是否有FK到父模型?

1 个答案:

答案 0 :(得分:0)

我不知道它是否有效,但一个想法对你来说很清楚。

所以,我找到了Select小部件的源代码,用于在html中设置selected属性。它是here,只搜索selected_html

您可以尝试继承Select小部件:

from django.forms.widgets import Select

class CustomSelect(Select):
    def render_option(self, selected_choices, option_value, option_label):
        if option_value is None:
            option_value = ''
        option_value = force_text(option_value)
        if option_value in selected_choices:
            selected_html = ''  # make it empty string like in else statement or refactor all that method
            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, force_text(option_label))

然后是表格

class YourForm(forms.Form):
    your_field = forms.ModelChoiceField(widget=CustomSelect())
    ...

这是我提出的解决方案,我知道这不是那么优雅,但似乎没有简单的方法可以禁用selected