Разделенный запятыми текст вместо множественного выделения в форме Django для поля «многие ко многим» - PullRequest
0 голосов
/ 23 октября 2018

Итак, я разрабатываю веб-приложение для управления запасами в моей компании в Джанго (да, я знаю, что существует множество альтернатив с открытым исходным кодом, сейчас мы фактически используем fusioninventory, но я небосс ...).

Дело в том, что на одном компьютере может быть несколько пользователей, поэтому я реализовал его в модели как поле ManyToMany.Вот соответствующий код для модели, фильтра и HTML-шаблона.Обратите внимание, что я использую библиотеку django_filters для реализации поисковых фильтров и widget_tweaks, чтобы придать форме стиль.

models.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)])

filters.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',]

computer_list.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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        <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»так что я могу щелкнуть его, и он будет добавлен в поле.

Спасибо за ваше время.

1 Ответ

0 голосов
/ 23 октября 2018

Вы можете использовать ModelMultipleChoiceField

users = ModelMultipleChoiceField()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...