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

Django形式有选择,但也有自由文本选项?

赫连骏
2023-03-14
问题内容

我要寻找的是:单个小部件,它为用户提供了一个下拉选择列表,然后在其下方还有一个文本输入框,供用户输入新值。

后端模型将具有一组默认选项(但不会在模型上使用choices关键字)。我知道我可以(并且已经实现)通过将表单同时具有ChoicesField和CharField来实现这一点,并且如果ChoicesField保留为默认值,则代码可以使用CharField,但这感觉像“ un-django”。

有没有一种方法(使用Django-builtins或Django插件)为表单定义类似ChoiceEntryField(模仿IIRC的GtkComboboxEntry建模)的方法?


问题答案:

我会推荐一种自定义的Widget方法,HTML5允许你使用带有下拉列表的自由文本输入,该下拉列表可以用作“一键通”或“另一写”类型的字段,这就是我的方法:

fields.py

from django import forms

class ListTextWidget(forms.TextInput):
    def __init__(self, data_list, name, *args, **kwargs):
        super(ListTextWidget, self).__init__(*args, **kwargs)
        self._name = name
        self._list = data_list
        self.attrs.update({'list':'list__%s' % self._name})

    def render(self, name, value, attrs=None, renderer=None):
        text_html = super(ListTextWidget, self).render(name, value, attrs=attrs)
        data_list = '<datalist id="list__%s">' % self._name
        for item in self._list:
            data_list += '<option value="%s">' % item
        data_list += '</datalist>'

        return (text_html + data_list)

forms.py

from django import forms
from myapp.fields import ListTextWidget

class FormForm(forms.Form):
   char_field_with_list = forms.CharField(required=True)

   def __init__(self, *args, **kwargs):
      _country_list = kwargs.pop('data_list', None)
      super(FormForm, self).__init__(*args, **kwargs)

    # the "name" parameter will allow you to use the same widget more than once in the same
    # form, not setting this parameter differently will cuse all inputs display the
    # same list.
       self.fields['char_field_with_list'].widget = ListTextWidget(data_list=_country_list, name='country-list')

views.py

from myapp.forms import FormForm

def country_form(request):
    # instead of hardcoding a list you could make a query of a model, as long as
    # it has a __str__() method you should be able to display it.
    country_list = ('Mexico', 'USA', 'China', 'France')
    form = FormForm(data_list=country_list)

    return render(request, 'my_app/country-form.html', {
        'form': form
    })


 类似资料:
  • 问题内容: 我是Django的新手,如果您能向我提供一些指导,我将不胜感激。我正在尝试创建一种允许用户在一个或多个选项上打勾的表格。我知道我必须将MultiChoiceField字段与CheckboxSelectMultiple小部件一起使用,但是Django文档没有提供有关此主题的示例。如果您能给我一个例子并解释如何处理结果,将不胜感激。例如,如果我有一个带有选项abcd的表单,并且用户在c和d

  • Atom中的文本选择支持很多操作,比如区域选择、缩进和一些查找操作, 以及用引号或者括号把文字括起来之类的标记操作。 选择命令借鉴了很多查找命令。他们实际上具有相同的快捷键,只不过加了个shift。 ctrl-shift-P 选择当前位置到上一行的相同列 ctrl-shift-N 选择当前位置到下一行的相同列 ctrl-shift-B 选择前一个字符 ctrl-shift-F 选择后一个字符 al

  • 问题内容: 我想做的事情(显然不在IE中)是: 这将使文本节点具有页边空白。(甚至有可能吗?)如何使用CSS获得文本节点? 问题答案: 文本节点不能具有边距或任何其他样式,因此,您需要样式应用的所有内容都必须在元素中。如果您希望元素内部的某些文本的样式不同,则将其包裹在或中。

  • 问题内容: 如何以编程方式选择UITextField中的所有文本? 问题答案: 原来,调用-selectAll:使用非零发送者显示菜单。用nil调用它会使它选择文本,但不显示菜单。 在我的bug报告从Apple回来后,我建议我通过nil而不是self来尝试。 无需考虑UIMenuController或其他选择API。

  • 问题内容: django-smart-selects是一个优雅的解决方案,它使Django开发人员能够在其表单中链接选择输入。但是,正如开发人员在其问题清单中所报告的那样,在表单集中使用它时效果不佳。 它呈现的JavaScript与模型定义中“已链接字段”的ID绑定在一起。 当您在表单集中使用它时,您如何看待它如何工作?我认为小部件的渲染方法(请参阅django-smart- selects代码)

  • 上述两种文本框都支持select()方法,这个方法用于选择文本框中的所有文本。在调用select()方法时,大多数浏览器(Opera 除外)都会将焦点设置到文本框中。这个方法不接受参数,可以在任何时候被调用。下面来看一个例子。 var textbox = document.forms[0].elements["textbox1"]; textbox.select(); 在文本框获得焦点时选择其所有