2009-07-30 14 views

Odpowiedz

21

Patrząc na źródło Django ...

class CommaSeparatedIntegerField(CharField): 
    def formfield(self, **kwargs): 
     defaults = { 
      'form_class': forms.RegexField, 
      'regex': '^[\d,]+$', 
      'max_length': self.max_length, 
      'error_messages': { 
       'invalid': _(u'Enter only digits separated by commas.'), 
      } 
     } 
     defaults.update(kwargs) 
     return super(CommaSeparatedIntegerField, self).formfield(**defaults) 

Wyjazd że regex walidator. Wygląda tak długo, jak długo podajesz listę liczb całkowitych i przecinków, django nie będzie narzekać.

Można zdefiniować ją tak jak Charfield zasadniczo:

class Foo(models.Model): 
    int_list = models.CommaSeparatedIntegerField(max_length=200) 

i wypełnić go tak:

f = Foo(int_list="1,2,3,4,5") 
+1

Czy wiesz, czy maksymalna długość odpowiadająca polu zawiera przecinki? – khalid13

+2

tak, zawiera jako ciąg znaków. –

6

I właśnie stało się przedmiotem CommaSeparatedIntegerField w moim najnowszym projektem. Używałem MySQL i wydawało mi się, że dostarczanie ciągu wartości liczb całkowitych oddzielonych przecinkami jest bardzo przyjazne dla DB, np. "1,2,3,4,5". Jeśli chcesz zostawić to puste, po prostu podaj pusty ciąg.

To działa jak CharField i utkwił w dziwny sposób dla mnie. Skończyło się na wartościach takich jak "[1, 2, 3, 4, 5]", w tym nawiasach w mojej bazie danych! Więc uważaj!

0

Works dla wersji większy niż Django 1.9

Pierwszy krok: -importu tego (może ulec zmianie w nowszych wersjach, więc dokładnie sprawdzić, że)

from django.core.validators import validate_comma_separated_integer_list 

drugie Krok: -Napisz pole

class RestaurantLocation(models.Model): 
    name = models.CharField(max_length=200) 
    location = models.CharField(max_length=200,null=True,blank=True) 
    category = models.CharField(max_length=200,null=True,blank=False) 
    choices_field = models.CharField(validators=[validate_comma_separated_integer_list],max_length=200, blank=True, null=True,default='') 
    def __str__(self): 
     return self.name 

Uwaga: Pamiętaj, aby używać default = '' jeśli dodajesz kolumnę do już utworzonej bazy danych w inny sposób, co można uzyskać następujące opcje do wyboru po uruchomieniu python manage.py migrate


You are trying to add a non-nullable field 'choices_field' to restaurantlocation without a default; we can't do that (the database needs something to populate existing rows). 
Please select a fix: 
1) Provide a one-off default now (will be set on all existing rows with a 
null value for this column) 
2) Quit, and let me add a default in models.py 
Select an option: 

Szczęśliwy Coding !

Powiązane problemy