当前位置: 首页 > 面试题库 >

Django表单:如何动态创建ModelChoiceField标签

桂丰
2023-03-14
问题内容

我想为form.ModelChoiceField创建动态标签,我想知道如何做到这一点。我有以下表单类:

class ProfileForm(forms.ModelForm):

    def __init__(self, data=None, ..., language_code='en', family_name_label='Family name', horoscope_label='Horoscope type', *args, **kwargs):
        super(ProfileForm, self).__init__(data, *args, **kwargs)

        self.fields['family_name'].label = family_name_label
        .
        .
        self.fields['horoscope'].label = horoscope_label
        self.fields['horoscope'].queryset = Horoscope.objects.all()

    class Meta:
        model = Profile

    family_name = forms.CharField(widget=forms.TextInput(attrs={'size':'80', 'class': 'contact_form'}))
    .
    .
    horoscope = forms.ModelChoiceField(queryset = Horoscope.objects.none(), widget=forms.RadioSelect(), empty_label=None)

默认标签由Profile定义中指定的unicode函数定义。但是,需要动态创建由ModelChoiceField创建的单选按钮的标签。

首先,我认为我可以按照Django文档中的描述简单地覆盖ModelChoiceField。但这会创建静态标签。它允许你定义任何标签,但是一旦做出选择,该选择就是固定的。

所以我认为我需要适应添加一些东西到init:

class ProfileForm(forms.ModelForm):

    def __init__(self, data=None, ..., language_code='en', family_name_label='Family name', horoscope_label='Horoscope type', *args, **kwargs):
        super(ProfileForm, self).__init__(data, *args, **kwargs)

        self.fields['family_name'].label = family_name_label
        .
        .
        self.fields['horoscope'].label = horoscope_label
        self.fields['horoscope'].queryset = Horoscope.objects.all()
        self.fields['horoscope'].<WHAT>??? = ???

任何人有任何想法如何处理?任何帮助将不胜感激。

我找到了一些东西,但我不知道这是否是最佳解决方案。我将一些内容添加到类ProfileForm 的init部分中,如下所示:

class ProfileForm((forms.ModelForm):

    def __init__(self, data=None, ..., language_code='en', family_name_label='Family name', horoscope_label='Horoscope type', *args, **kwargs):
    super(ProfileForm, self).__init__(data, *args, **kwargs)

        # this function is added
        def get_label(self, language_code):
            """
            returns the label in the designated language, from a related object (table)
            """
            return HoroscopeLanguage.objects.get(horoscope=obj, language__language_code=language_code).horoscope_type_language

        self.fields['family_name'].label = family_name_label
        .
        .
        self.fields['horoscope'].queryset = Horoscope.objects.all()
        self.fields['horoscope'].label_from_instance = lambda obj: "%s: Euro %.2f" % (HoroscopeLanguage.objects.get(horoscope=obj, language__language_code=language_code).horoscope_type_language, obj.price)
        .
        .
        """
        The next code also works, the lambda function without the get_label function
        """
        self.fields['horoscope'].label_from_instance = lambda obj: "%s: Euro %.2f" % (obj.horoscope_type, obj.price)
        .
        .
        """
        But this code doesn't work. Anyone?
        """
        self.fields['horoscope'].label_from_instance = get_label(obj, language_code)

问题答案:

你可以使用a ModelChoiceField然后ProfileForm.__init__动态更改你的选择,例如(假设它已经是ModelChoiceField):

horoscopes = Horoscope.objects.all()
self.fields['horoscope'].choices = [(h.pk, h.name) for h in horoscopes]

h.name 在本例中将用作选择的标签!



 类似资料:
  • 我刚到姜戈。我目前正在通过推特应用编程接口对实时用户推文进行情感分析。我已经设法做了分析和表达情感。现在,我想在我的Django应用程序中使用图表(也许是条形图或饼图)来可视化情感,但我不确定如何实现。 我在考虑使用图表。js使其具有响应性,但大多数示例都使用静态数据,因此我没有成功地将从Twitter API提取的数据与图表集成。js。 这是我的网页截图。这张表格是摘录的推特及其相应的情感。然而

  • 本文向大家介绍JavaScript如何动态创建table表格,包括了JavaScript如何动态创建table表格的使用技巧和注意事项,需要的朋友参考一下 两种JavaScript动态创建table表格的方法,分享给大家,具体实现如下 方法一:最原始的方法,创建一一元素 方法二:利用table对象里面含有的函数:插入行和插入列 动态的创建和删除: 创建表格,通过输入的值: 删除行: 删除列: 完整

  • 问题内容: 我在使用primefaces树实现实现动态树结构时遇到了一些麻烦。在primeface提供的展示柜中,代码的结构如下所示。但是,这是非常静态的。我试图弄清楚如何处理从数据库中获取的数据,在编译时树的深度是未知的。 我以为我可能需要某种递归方法来实现此目的,但我无法完全理解实现的样子。 有什么想法吗? 以下是primefaces的示例代码 问题答案:

  • 问题内容: 我在mysql上创建数据库。首先创建主体表,每个表平均有30列。日志表的标准是引用表的pk加上每列*2。像这样: 参考表: 日志表: 现在,我想要创建一个过程,在该过程中,我将表名作为参数传递,并生成表日志查询并执行它。 做这个的最好方式是什么? 问题答案: 为了使一个字符串代表一个表(或数据库)名称,您将需要用变量连接查询字符串,并在存储过程中准备/执行一条语句。这是一个基本示例。

  • 问题内容: 我正在寻找学习如何动态构建Redux表单。想法是,名为componentDidMount的组件从服务器处获取项目列表,并将其插入商店store.my_items中: 现在这些项目都在商店中,我想为store.my_items中的每个项目构建一个带有字段的redux表单。 例如,其中一些动态创建: 使用react,redux-form,什么是构建这种动态redux表单的正确方法? 谢谢

  • 本文向大家介绍Bootstrap如何创建表单,包括了Bootstrap如何创建表单的使用技巧和注意事项,需要的朋友参考一下 Bootstrap表单类型分为三种格式:垂直或基本表单、内联表单、水平表单。 垂直或基本表单(display:block;) 基本的表单结构是 Bootstrap 自带的,个别的表单控件自动接收一些全局样式。下面列出了创建基本表单的步骤: 向父 <form> 元素添加 rol