2013-08-20 12 views
5

jestem delegowania wniosek reszta tak:Django: DateField "To pole nie może być puste."

{title:some title, recurring:true, day:Wednesday, time:12:30, description:some text} 

nie jestem przechodzącej datę ponieważ zdarzenie jest powtarzalne i wartość powinna być pusta. Odpowiedź serwera:

{"date": ["This field cannot be blank."]} 

Oto odpowiedni kod Python:

class Event(models.Model): 
    title = models.CharField(max_length=200) 
    recurring = models.BooleanField() 
    day = models.CharField(max_length=20, blank=True) 
    date = models.DateField(null=True) 
    time = models.TimeField() 
    description = models.CharField(max_length=500) 
    venue = models.CharField(max_length=200, blank=True) 
    venueAddress = models.CharField(max_length=200, blank=True) 
    venueCity = models.CharField(max_length=200, blank=True) 

class EventSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Event 

class EventViewSet(viewsets.ModelViewSet): 
    queryset = Event.objects.all() 
    serializer_class = EventSerializer 

nie jestem całkowicie pewien, gdzie się komunikat wraca z. Czy mój model jest poprawnie zdefiniowany? Czy potrzebuję dodatkowej pracy w moim serializatorze?

Odpowiedz

13

Dodaj parametr blank=True do definicji swojego pola date, jeśli chcesz, aby to pole było opcjonalne.

Z docs:

pamiętać, że jest inna niż null. null jest wyłącznie związany z bazą danych, podczas gdy puste jest związane z walidacją. Jeśli pole ma puste = True, sprawdzanie poprawności formularza pozwoli wprowadzić pustą wartość. Jeśli pole ma puste = Fałsz, pole będzie wymagane.

+0

Łącze do Dokumentów jest zepsute. –

+1

@GeoffreyIrving - dzięki, zaktualizowano do nowszej wersji. –

1

Wygląda na to, że używasz biblioteki, która z kolei używa django.forms.ModelForm.

W takim przypadku można dodać puste pole = True do pola DateField, aby rozwiązać problem.

class Event(models.Model): 
    title = models.CharField(max_length=200) 
    recurring = models.BooleanField() 
    day = models.CharField(max_length=20, blank=True) 
    date = models.DateField(null=True, blank=True) 
    time = models.TimeField() 
    description = models.CharField(max_length=500) 
    venue = models.CharField(max_length=200, blank=True) 
    venueAddress = models.CharField(max_length=200, blank=True) 
    venueCity = models.CharField(max_length=200, blank=True) 
5

Pierwszym krokiem jest, aby zmienić opis pola tak:

date = models.DateField(null=True, blank=True) 

null=True jest niewystarczające, ponieważ jest to tylko dyrektywy dotyczące tworzenia tabeli, nie do walidacji. null i blank są oddzielnymi koncepcjami, ponieważ istnieją sytuacje, w których chcesz tylko jeden, a nie drugi.

Nawiasem mówiąc, w prawie wszystkich przypadkach pole date i time można skompresować w jeden numer DateTimeField.

+0

Jest to prawdopodobnie jeden z przypadków, w których pole daty i czasu nie może być skompresowane, więc ten projekt pozwala na wyłączenie daty dla wydarzeń cyklicznych. –

+0

Tak, uważnie przyjmuję kod, o którym mowa, zgadzam się. –

Powiązane problemy