Wie @Alasdair sagte, werden Sie ein benutzerdefiniertes Feld erstellen müssen:
class UnsetType:
def __str__(self):
return '__unset__'
Unset = UnsetType()
class UnsetOrNullBooleanSelect(NullBooleanSelect):
def __init__(self, attrs=None):
choices = (
('__unset__', ugettext_lazy('Unset')),
('1', ugettext_lazy('Unknown')),
('2', ugettext_lazy('Yes')),
('3', ugettext_lazy('No')),
)
super().__init__(attrs, choices)
def render(self, name, value, attrs=None):
try:
value = {
True: '2', False: '3', None: '1',
'2': '2', '3': '3', '1': '1',
}[value]
except KeyError:
value = '__unset__'
return super().render(name, value, attrs)
def value_from_datadict(self, data, files, name):
value = data.get(name)
return {
'1': None, None: None, 'None': None, 'none': None, 'null': None,
'2': True, True: True, 'True': True,
'3': False, 'False': False, False: False,
}.get(value, Unset)
class UnsetOrNullBooleanField(NullBooleanField):
widget = UnsetOrNullBooleanSelect
def to_python(self, value):
if value in (True, 'True', 'true', '1'):
return True
elif value in (False, 'False', 'false', '0'):
return False
elif value in (None, 'None', 'none', 'null'):
return None
else:
return Unset
Ich glaube nicht, dass eine Art und Weise gibt es zwischen den beiden zu unterscheiden - ich denke, Sie 'Unterklasse müssen die NullBooleanSelect' Widget und 'NullBooleanField'. – Alasdair
Was ist der Unterschied zwischen den beiden? – e4c5
@ e4c5 gibt es vier Möglichkeiten zu suchen. Stellen Sie sich vor, die Tabelle hat drei Zeilen. Eine Zeile mit ok = true, eine mit ok = false, eine mit ok = NULL. Die vierte Art zu suchen ist: Ignoriere diese Spalte. Hast du das verstanden? Wenn nicht bitte, frage nochmal. – guettli