web-dev-qa-db-fra.com

Django Modèle à choix multiples

Je sais qu'il n'y a pas MultipleChoiceField pour un Modèle, vous ne pouvez l'utiliser que sur des formulaires.

Aujourd'hui, je suis confronté à un problème lors de l'analyse d'un nouveau projet associé à plusieurs choix.

Je voudrais avoir un champ comme un CharField avec choices avec l'option de choix multiple.

J'ai résolu ce problème d'autres fois en créant un CharField et en gérant les multiples choix du formulaire avec un forms.MultipleChoiceField et enregistrez les choix séparés par des virgules.

Dans ce projet, à cause de la configuration, je ne peux pas le faire comme je l'ai mentionné ci-dessus, je dois le faire dans les modèles, et je préfère [~ # ~] pas [~ # ~] éditez le formulaire d'administration Django ni utilisez les formulaires. J'ai besoin d'un champ de modèle avec une option à choix multiples

  • Quelqu'un a-t-il résolu ce problème via des modèles?

Peut-être que remplacer certains modèles ou utiliser un widget personnalisé ... Je ne sais pas, je suis un peu perdu.


Modifier

Je suis conscient de simple choix, j'aimerais avoir quelque chose comme:

class MODEL(models.Model):
    MY_CHOICES = (
        ('a', 'Hola'),
        ('b', 'Hello'),
        ('c', 'Bonjour'),
        ('d', 'Boas'),
    )
    ...
    ...
    my_field = models.CharField(max_length=1, choices=MY_CHOICES)
    ...

mais avec la possibilité de sauvegarder choix multiples pas seulement 1 choix.

44
AlvaroAV

Vous devez réfléchir à la manière dont vous allez stocker les données au niveau de la base de données. Cela dictera votre solution.

Vraisemblablement, vous voulez une seule colonne dans une table qui stocke plusieurs valeurs. Cela vous obligera également à réfléchir à la façon dont vous allez sérialiser. Par exemple, vous ne pouvez pas simplement séparer les virgules si vous devez stocker des chaînes pouvant contenir des virgules.

Cependant, il vaut mieux utiliser une solution semblable à l'une des suivantes:

49
spookylukey

Si vous utilisez Postgres, pensez à utiliser ArrayField .

from Django.db import models
from Django.contrib.postgres.fields import ArrayField

class WhateverModel(models.Model):
    WHATEVER_CHOICE = u'1'
    SAMPLE_CHOICES = (
        (WHATEVER_CHOICE, u'one'),
    )
    choices = ArrayField(
        models.CharField(choices=SAMPLE_CHOICES, max_length=2, blank=True, default=WHATEVER_CHOICE),
    )
40
lechup

Des deux, https://pypi.python.org/pypi/Django-select-multiple-field/ semble plus complet et plus complet. Il a même un bel ensemble de désintéressement.

Le problème que j'ai trouvé est qu'il jette un avertissement Django 1.10) dans la classe qui implémente le champ de modèle.

J'ai corrigé ceci et envoyé un PR. Le dernier code, jusqu’à ce qu’ils fusionnent mes relations publiques (s’ils décident de passer à autre chose), se trouve dans ma fourchette de rapport, ici: https://github.com/matiasherranz/Django-select-multiple-field =

À votre santé!

M.-

10
Matias Herranz

Si vous souhaitez que le widget ressemble à une entrée de texte tout en permettant de sélectionner plusieurs options parmi les suggestions, vous recherchez peut-être Select2 . Il existe aussi Django-select2 qui l’intègre avec Django Forms and Admin.

0
Risadinha