在单个django模型字段中选择多个选项

django-select-multiple-field的Python项目详细描述


在单个django model字段中选择多个选项。想用就用 将多项选择存储在一个字段中,而不使用多对多关系。

https://github.com/kelvinwong-ca/django-select-multiple-field/raw/master/docs/images/select_multiple_cropped.jpg

使用jquery的multiselect.js插件呈现[1]

[1]jquery.multi-select.js https://github.com/lou/multi-select

快速启动

重要

字段属性max_length必须设置为比 期望的最长编码字符串

重要

选项必须是字符串,而不是整数。

在您的型号中,通常添加选择字段选项:

# models.py

class Pizza(models.Model):
    ANCHOVIES = 'a'
    BLACK_OLIVES = 'b'
    PEPPERONI = 'p'
    MOZZARELLA = 'm'
    TOPPING_CHOICES = (
        (ANCHOVIES, 'Anchovies'),
        (BLACK_OLIVES, 'Black olives'),
        (PEPPERONI, 'Pepperoni'),
        (MOZZARELLA, 'Mozzarella'),
    )

    toppings = SelectMultipleField(
        max_length=10,
        choices=TOPPING_CHOICES
    )

像往常一样使用通用视图或模型表单。在模板中,您可以使用常规表单标记:

# template_form.html

<form action="" method="post">
  {{ form.as_p  }}
  <input type="submit" value="Submit">
</form>

这将呈现以下HTML:

# create.html

<form action="" method="post">
    <p>
      <label for="id_toppings">Toppings:</label>
      <select multiple="multiple" id="id_toppings" name="toppings"
          class="select-multiple-field">
        <option value="a">Anchovies</option>
        <option value="b">Black olives</option>
        <option value="p">Pepperoni</option>
        <option value="m">Mozzarella</option>
      </select>
    </p>
    <input type="submit" value="Submit">
</form>

显示存储的选项

要显示您的选择,您需要解码字段内容。这个罐头 使用模板标记完成:

# templatetags/pizza_tags.py

def decode_pie(ingredients):
    """
    Decode pizza pie toppings
    """
    decoder = dict(Pizza.TOPPING_CHOICES)
    decoded = [decoder[t] for t in ingredients]
    decoded.sort()
    return ', '.join(decoded)

register.filter('decode_pie', decode_pie)

在模板中,您需要导入标记并使用它们:

# details.html

{% load pizza_tags %}

{{ pizza.toppings|decode_pie }}

对选项进行编码

选定的选项存储为逗号分隔的文本。考虑 有以下配料的比萨饼。

  • Pepperoni
  • Mozzarella

它将作为字符字段存储为:

p,m

使用编解码器中的函数将此编码字符串解码为python列表 模块:

>>> from select_multiple_field.codecs import *
>>> encoded = 'a,b,c'
>>> decoded = decode_csv_to_list(encoded)
>>> print decoded
[u'a', u'b', u'c']
>>> print type(decoded)
<type 'list'>

编码方法可能会限制您搜索选择的能力。

示例应用程序

如果您下载了tarball,就会包含一个示例应用程序。您可以这样尝试:

$ pwd
/home/user/teststuff/django-select-multiple-field
$ cd test_projects/django14
$ python manage.py syncdb
$ python manage.py runserver

Validating models...

0 errors found
Django version 1.4.19, using settings 'django14.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

故障排除

django select multiple字段包含两个测试套件。一个用于现场,一个用于Django 1.4.19项目中现场的实施。

您可以下载tarball并在setup.py:

中运行“test”来运行现场测试
$ python setup.py test

您可以以类似的方式运行django 1.4.19演示测试:

$ python setup.py test_demo

不用说你需要安装django 1.4.19或更高版本。

虫子!救命啊!!

如果您发现此软件中有任何错误,请通过github报告 发出追踪器[2]或向code@kelvinwong.ca发送电子邮件。任何严重的 安全漏洞只能通过电子邮件报告。

[2]Django-select-multiple-field issue tracker https://github.com/kelvinwong-ca/django-select-multiple-field/issues

谢谢

感谢您花时间评估此软件。我很感激 收到关于您使用它的经验的反馈,我欢迎使用代码 贡献与发展思路。

http://www.kelvinwong.ca/coders

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
安卓中的java标签长点击问题   JavaSpringMVC多行表单提交提交新的ModelAttribute   程序来查找java程序中的方法数   在JSF中自动选择java下拉列表   java onNext为ArrayList的每个元素触发,而不是使用RXJava触发一次   为什么java不允许创建内部类的实例?   JavaJSF<p:calendar>小部件在选择不同月份时不会刷新   java如何限制JFileChooser只允许选择特定数量的文件?   java ANT build无法识别geckodriver可执行文件“驱动程序可执行文件不存在”   java TextView空指针异常   java试图在安卓中传递参数   如何将XML配置转换为Java   java支持使用JAXRPC的soap服务,但pom中没有定义它。xml   在Java中检查整个ArrayList