gpt4 book ai didi

django - 带有复选框的表单集

转载 作者:行者123 更新时间:2023-12-01 01:32:00 24 4
gpt4 key购买 nike

我希望能够在页面上显示模型列表,并允许用户同时选择其中的几个。

例如,假设我有一个用户选择屏幕,用于模型:

class User(model):
first = # char field
last = # char field
birthdate = # date

然后我想向用户展示并让他们选择其中之一:
Please select users:
[] John Smith Jan, 2001
[] Mike Davis Feb, 2002
[] John Doe Dec, 2000

[Continue]

然后将发布并处理此表单。

我能想到的一种方法是使用 ModelFormset。
问题是当我尝试使用 ModelFormsets 来显示用户时,我无法添加复选框。

我能想到的另一种方法是创建一个表单,并在其上输出一大堆具有特定 id 的复选框。然后提交 - 遍历所有选定的复选框。不确定这将如何与 Django 的表单一起使用。

欢迎任何建议。谢谢。

编辑:事实证明,通过在同一个名称组中为每个复选框提供一个 ID(例如患者 ID),并在 django View 中简单地查看 POST 字典,这正是我所需要的!

最佳答案

我创建了一个自定义 SelectMultiple 小部件,用于在表单仍称为 newforms 时显示对象详细信息以及用于选择的复选框 - 它似乎仍然有效:

from django.forms import CheckboxInput, SelectMultiple
from django.utils.encoding import force_unicode
from django.utils.html import escape
from django.utils.safestring import mark_safe

class TableSelectMultiple(SelectMultiple):
"""
Provides selection of items via checkboxes, with a table row
being rendered for each item, the first cell in which contains the
checkbox.

When providing choices for this field, give the item as the second
item in all choice tuples. For example, where you might have
previously used::

field.choices = [(item.id, item.name) for item in item_list]

...you should use::

field.choices = [(item.id, item) for item in item_list]
"""
def __init__(self, item_attrs, *args, **kwargs):
"""
item_attrs
Defines the attributes of each item which will be displayed
as a column in each table row, in the order given.

Any callables in item_attrs will be called with the item to be
displayed as the sole parameter.

Any callable attribute names specified will be called and have
their return value used for display.

All attribute values will be escaped.
"""
super(TableSelectMultiple, self).__init__(*args, **kwargs)
self.item_attrs = item_attrs

def render(self, name, value, attrs=None, choices=()):
if value is None: value = []
has_id = attrs and 'id' in attrs
final_attrs = self.build_attrs(attrs, name=name)
output = []
str_values = set([force_unicode(v) for v in value]) # Normalize to strings.
for i, (option_value, item) in enumerate(self.choices):
# If an ID attribute was given, add a numeric index as a suffix,
# so that the checkboxes don't all have the same ID attribute.
if has_id:
final_attrs = dict(final_attrs, id='%s_%s' % (attrs['id'], i))
cb = CheckboxInput(final_attrs, check_test=lambda value: value in str_values)
option_value = force_unicode(option_value)
rendered_cb = cb.render(name, option_value)
output.append(u'<tr><td>%s</td>' % rendered_cb)
for attr in self.item_attrs:
if callable(attr):
content = attr(item)
elif callable(getattr(item, attr)):
content = getattr(item, attr)()
else:
content = getattr(item, attr)
output.append(u'<td>%s</td>' % escape(content))
output.append(u'</tr>')
return mark_safe(u'\n'.join(output))

示例形式:
class JobSelectionForm(forms.Form):
jobs = forms.MultipleChoiceField(widget=TableSelectMultiple(
item_attrs=('formatted_number', 'name', 'client', 'get_status_display')))

def __init__(self, accessible_jobs, *args, **kwargs):
super(JobSelectionForm, self).__init__(*args, **kwargs)
self.fields['jobs'].choices = [(j.id, j) \
for j in accessible_jobs]

使用上面的表单,您可以在实例化表单对象时将要显示的项目列表作为第一个参数传递。

模板:
{% if form.jobs.errors %}{{ form.jobs.errors }}{% endif %}
<table>
<thead>
<tr>
<th>&nbsp;</th>
<th>Number</th>
<th>Name</th>
<th>Client</th>
<th>Status</th>
</tr>
</thead>
<tbody>
{{ form.jobs }}
</tbody>
</table>

关于django - 带有复选框的表单集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4218555/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com