python - 多对多字段的 Django 表单上的逗号分隔文本而不是多项选择
问题描述
所以,我正在开发一个 Web 应用程序来控制我公司在 Django 中的库存(是的,我知道那里有很多开源替代品,我们现在实际上正在使用 fusioninventory,但我不是老板...... .)。
问题是,一台计算机可以有多个用户,所以我在模型上将它实现为 ManyToMany 字段。这是模型、过滤器和html模板的相关代码。请注意,我使用 django_filters lib 来实现搜索过滤器和 widget_tweaks 为表单提供一些样式。
模型.py
class Computer(models.Model):
tag = models.CharField(max_length = 20, unique=True)
users = models.ManyToManyField(User, blank = True, default = 'No_User',)
TYPE = (
('DESK','Desktop'),
('LAP','Laptop'),
)
computertype = models.CharField(
max_length = 4,
choices = TYPE,
)
STATUS = (
('OK','OK'),
('Broken','Broken'),
('Unusable','Unusable'),
)
computerstatus = models.CharField(
max_length = 12,
choices = STATUS,
default = 'OK',
)
model = models.CharField(max_length = 36)
serial = models.CharField(max_length = 36)
buy_date = models.DateField()
modified_date = models.DateTimeField(auto_now=True)
def __str__(self):
return self.tag
def get_absolute_url(self):
return reverse('computer_detail', args=[str(self.id)])
过滤器.py
class UserFilter(django_filters.FilterSet):
class Meta:
model = User
fields = {
'username': ['contains'],
}
class ComputerFilter(django_filters.FilterSet):
tag = django_filters.CharFilter(lookup_expr="icontains",label = 'Etiqueta',)
computertype = django_filters.ChoiceFilter(choices = Computer.TYPE, lookup_expr="icontains",label = 'Tipo',)
computerstatus = django_filters.ChoiceFilter(choices = Computer.STATUS, lookup_expr="icontains",label = 'Estado',)
**users = UserFilter()**
from = django_filters.DateFilter(field_name='buy_date', lookup_expr="gt", label='Adquiridos desde',)
to = django_filters.DateFilter(field_name='buy_date', lookup_expr="lt", label='Hasta',)
class Meta:
model = Computer
fields = ['tag','users','computertype','computerstatus',]
计算机列表.html
<form method="get">
<div class="well">
<center><h4><b>Filtro</b></h4></center>
<center><table>
<tr>
<td><div class"form-group">
{{ filter.form.tag.label_tag}}
{% render_field filter.form.tag class="form-control" %}
</div></td>
<td> </td>
<td></td>
</tr>
<tr>
<td><div class"form-group">
{{ filter.form.computertype.label_tag}}
{% render_field filter.form.computertype class="form-control" %}
</div></td>
<td> </td>
<td><div class"form-group">
{{ filter.form.computerstatus.label_tag}}
{% render_field filter.form.computerstatus class="form-control" %}
</div></td>
</tr>
<tr>
<td><div class"form-group">
{{ filter.form.desde.label_tag}}
{% render_field filter.form.desde class="form-control" type="date" %}
</div></td>
<td> </td>
<td><div class"form-group">
{{ filter.form.hasta.label_tag}}
{% render_field filter.form.hasta class="form-control" type="date" %}
</div></td>
</tr>
<tr>
<td><div class"form-control" input type ="text">
{{ filter.form.users.label_tag}}
{% render_field filter.form.users class="form-control" %}
</div></td>
<td></td>
</tr>
</table></center>
<div>
<p> </p><center><button type="submit" class="btn btn-primary">
<span class="glyphicon glyphicon-search"></span> Buscar
</button></center>
</div>
</div>
</form>
你可以在github上看到完整的代码
现在过滤器表单看起来像这样: 查看图片
问题:有没有一种简单的方法可以让表单字段接受如下输入:user1, user2, ..., usern 而不是选择用户?
奖励:有没有办法实现它,使其也具有自动完成功能(例如,我写了 - user1,use - 它向我显示了所有以“use”开头的用户,所以我可以单击它并将其添加到字段中.
感谢您的时间。
解决方案
您可以使用 ModelMultipleChoiceField
users = ModelMultipleChoiceField()
推荐阅读
- javascript - 如果日期是过去或将来,则删除 json 特定数据
- javascript - 请求标头未使用 Fetch API 填充
- typescript - VSCode 是否在工具提示中准确显示正确的 Typescipt 类型?no-unnecessary-type-assertion 错误
- javascript - 显示 JavaStript 结果中的所有值
- php - 音频跟踪/分析/统计
- hexo - Hexo 内部链接到页面部分
- jmeter - 线程组中各项的处理顺序是怎样的?
- c++ - 关于 C++ 中的 Lambda 函数
- php - php pdo查询while循环有问题
- vue.js - 如果数据属性在 VueJs 中从父组件传递到子组件,则无法将其作为对象进行操作