2013-08-20 12 views
5

mir eine Pause Anfrage wie dieses Posting:Django: DateField "Dieses Feld darf nicht leer sein."

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

ich das Datum nicht vorbei bin, weil das Ereignis wiederkehrend und der Wert leer sein sollte. Die Serverantwort lautet:

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

Hier ist der relevante Python-Code:

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 

Ich bin nicht ganz sicher, wo die Nachricht herkommt zurück. Ist mein Modell korrekt definiert? Benötige ich zusätzliche Arbeit in meinem Serializer?

Antwort

13

Fügen Sie der Definition Ihres date Felds den Parameter blank=True hinzu, wenn dieses Feld optional sein soll.

Vom docs:

Beachten Sie, dass diese als null verschieden ist. null ist rein datenbankbezogen, während blank auf die Validierung bezogen ist. Wenn ein Feld leer = True ist, erlaubt die Formularüberprüfung die Eingabe eines leeren Wertes. Wenn ein Feld leer = False ist, wird das Feld benötigt.

+0

Docs-Verknüpfung ist unterbrochen. –

+1

@GeoffreyIrving - danke, auf eine neuere Version aktualisiert. –

1

Es sieht so aus, als ob Sie eine Bibliothek verwenden, die wiederum django.forms.ModelForm verwendet.

Wenn dies der Fall ist, können Sie Ihrem DateField leer = True hinzufügen, um das Problem zu beheben.

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

Der erste Schritt ist Ihre Feldbeschreibung wie so zu ändern:

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

null=True unzureichend ist, weil das nur eine Richtlinie relevante Tabellenerstellung ist, nicht bis zur Validierung. null und blank sind separate Konzepte, da es Situationen gibt, in denen Sie nur eines wollen und nicht das andere.

Übrigens kann in fast allen Fällen ein date und ein time Feld zu einem komprimiert werden.

+0

Dies ist wahrscheinlich einer der Fälle, in denen das Datums- und Uhrzeitfeld nicht komprimiert werden kann. Daher ermöglicht dieses Design, das Datum für wiederkehrende Ereignisse zu deaktivieren. –

+0

Ja, ich betrachte den betreffenden Code genauer. –

Verwandte Themen