2013-09-07 9 views
19

Ich lese das Tutorial hier: https://docs.djangoproject.com/en/1.5/ref/models/fields/#choices und ich versuche, eine Box zu erstellen, wo der Benutzer den Monat wählen kann, in dem er geboren wurdeWie man die "Auswahl" -Feld-Option in Django richtig verwendet

MONTH_CHOICES = (
    (JANUARY, "January"), 
    (FEBRUARY, "February"), 
    (MARCH, "March"), 
    .... 
    (DECEMBER, "December"), 
) 

month = CharField(max_length=9, 
        choices=MONTHS_CHOICES, 
        default=JANUARY) 

Ist das korrekt? Ich sehe, dass im Tutorial ich las, sie aus irgendeinem Grund erstellt Variablen zuerst, wie so

FRESHMAN = 'FR' 
SOPHOMORE = 'SO' 
JUNIOR = 'JR' 
SENIOR = 'SR' 

Warum sie diese Variablen erstellt haben? Auch die MONTHS_CHOICES ist in einem Modell namens People, also würde der Code, den ich zur Verfügung gestellt habe, eine Spalte "Monate Auswahl" in der Datenbank namens "Leute" erstellen und würde sagen, in welchem ​​Monat der Benutzer geboren wurde, nachdem er auf die Monate geklickt hat und sendet das Formular

+0

diesen Punkt hinzufügen Ich schlage vor, Sie schauen in [Django-Auswahl] (https://github.com/bigjason/django-choices) Paket. –

Antwort

15

nach den documentation:

Field.choices

ein iterable (zB eine Liste oder Tupel), die aus sich selbst von Iterables von genau zwei Elemente (zB [(A, B), (A, B) ...]), um als Auswahlmöglichkeiten für dieses Feld zu verwenden Wenn dies angegeben wird, wird das Standardformular Widget ein Auswahlfeld mit diesen Auswahlmöglichkeiten anstelle des Standard-Textfelds sein.

Das erste Element in jedem Tupel ist der tatsächlich zu speichernde Wert und das zweite Element ist der für Menschen lesbare Name.

So ist der Code korrekt, außer dass Sie entweder JANUARY Variablen definieren sollten, FEBRUARY usw. oder calendar Modul verwenden definieren MONTH_CHOICES:

import calendar 

... 

class MyModel(models.Model): 
    ... 

    MONTH_CHOICES = [(str(i), calendar.month_name[i]) for i in range(1,13)] 

    month = CharField(max_length=9, choices=MONTHS_CHOICES, default='1') 
+0

hm ok, dank – user2719875

3

Sie nicht bloße Worte im Code haben Aus diesem Grund haben sie Variablen erstellt (Ihr Code schlägt mit NameError fehl).

Der von Ihnen bereitgestellte Code würde eine Datenbanktabelle mit dem Namen month (plus dem Präfix, das django hinzufügt) erstellen, denn das ist der Name der CharField.

Aber es gibt bessere Möglichkeiten, um die gewünschten Entscheidungen zu treffen. Siehe a previous Stack Overflow question.

import calendar 
tuple((m, m) for m in calendar.month_name[1:]) 
+0

in Ordnung perfekt, danke :) – user2719875

45

Ich glaube, niemand wirklich auf die erste Frage beantwortet hat:

Warum haben sie schaffen diese Variablen?

Diese Variablen sind nicht unbedingt erforderlich. Das ist wahr. Sie können so etwas perfekt machen:

MONTH_CHOICES = (
    ("JANUARY", "January"), 
    ("FEBRUARY", "February"), 
    ("MARCH", "March"), 
    # .... 
    ("DECEMBER", "December"), 
) 

month = models.CharField(max_length=9, 
        choices=MONTH_CHOICES, 
        default="JANUARY") 

Warum ist die Verwendung von Variablen besser? Fehlervermeidung und logische Trennung.

JAN = "JANUARY" 
FEB = "FEBRUARY" 
MAR = "MAR" 
# (...) 

MONTH_CHOICES = (
    (JAN, "January"), 
    (FEB, "February"), 
    (MAR, "March"), 
    # .... 
    (DEC, "December"), 
) 

Stellen Sie sich nun vor, Sie haben eine Ansicht, in der Sie eine neue Model-Instanz erstellen.Statt dies zu tun:

new_instance = MyModel(month='JANUARY') 

Sie werden dies tun:

new_instance = MyModel(month=MyModel.JAN) 

In der ersten Option, die Sie den Wert sind hartzucodieren. Wenn es eine Reihe von Werten gibt, die Sie eingeben können, sollten Sie diese Optionen beim Codieren einschränken. Auch, wenn Sie schließlich den Code an der Modellschicht müssen sich ändern, jetzt müssen Sie keine Veränderung der Ansichten Schicht zu machen.

+0

Dies ist der Punkt, Ich mag wissen würde. Vielen Dank. –

+0

Danke für die ausführliche Erklärung und das Beispiel. – tarikki

+0

Sie sollten ernsthaft in Erwägung ziehen Variablen Namensräume Sie für Entscheidungen nutzen in Django Modellfelder; sollte es offensichtlich sein, dass die Variable zu einem bestimmten Feld, um verwirrende Zukunft Programmierer zu vermeiden verwendet ist, die ähnlichen Auswahlfelder zum Modell hinzufügen könnte. In Python 3, verwende ich eine IntEnum Klasse für dieses und ich nenne es in einer Weise, dass es auf der Hand, welches Modell Feld macht es betrifft. – Adam

Verwandte Themen