Edit: aktualisiert, um es mit UpdateView funktioniert auch
Also, was ich suchte
utils.py zu sein scheint:
from django.core.exceptions import ValidationError
from django import forms
class OptionalChoiceWidget(forms.MultiWidget):
def decompress(self,value):
#this might need to be tweaked if the name of a choice != value of a choice
if value: #indicates we have a updating object versus new one
if value in [x[0] for x in self.widgets[0].choices]:
return [value,""] # make it set the pulldown to choice
else:
return ["",value] # keep pulldown to blank, set freetext
return ["",""] # default for new object
class OptionalChoiceField(forms.MultiValueField):
def __init__(self, choices, max_length=80, *args, **kwargs):
""" sets the two fields as not required but will enforce that (at least) one is set in compress """
fields = (forms.ChoiceField(choices=choices,required=False),
forms.CharField(required=False))
self.widget = OptionalChoiceWidget(widgets=[f.widget for f in fields])
super(OptionalChoiceField,self).__init__(required=False,fields=fields,*args,**kwargs)
def compress(self,data_list):
""" return the choicefield value if selected or charfield value (if both empty, will throw exception """
if not data_list:
raise ValidationError('Need to select choice or enter text for this field')
return data_list[0] or data_list[1]
Beispiel verwenden
(forms.py)
from .utils import OptionalChoiceField
from django import forms
from .models import Dummy
class DemoForm(forms.ModelForm):
name = OptionalChoiceField(choices=(("","-----"),("1","1"),("2","2")))
value = forms.CharField(max_length=100)
class Meta:
model = Dummy
(Beispiel Dummy model.py :)
from django.db import models
from django.core.urlresolvers import reverse
class Dummy(models.Model):
name = models.CharField(max_length=80)
value = models.CharField(max_length=100)
def get_absolute_url(self):
return reverse('dummy-detail', kwargs={'pk': self.pk})
(Probe Dummy views.py:)
from .forms import DemoForm
from .models import Dummy
from django.views.generic.detail import DetailView
from django.views.generic.edit import CreateView, UpdateView
class DemoCreateView(CreateView):
form_class = DemoForm
model = Dummy
class DemoUpdateView(UpdateView):
form_class = DemoForm
model = Dummy
class DemoDetailView(DetailView):
model = Dummy
Interessant. Hoffe, dass es Ihnen nichts ausmacht, aber ich habe ein paar kleine Änderungen vorgenommen (fühlen Sie sich frei, wenn Sie es tun). Aus Neugier, gibt es einen Weg, um es alle Optionen zeigen zu zeigen (Was ich bekomme ist, dass wenn ich einen Buchstaben eintippe, es alles zeigt, was dazu passt; ich bin eher in der Lage, eine vollständige Liste aller möglichen Eingaben zu bekommen) – Foon
(Hmm ... eigentlich ist der HTML-Code im Allgemeinen ein bisschen wackelig, was vielleicht an meinem übermäßig schnellen und schmutzigen Testen liegen könnte ... was ist das Verhalten, das ich sehen sollte? Drop-down rechts neben dem Textfeld bei Klick oder Weiter Typ oder etwas anderes? – Foon
Leider ist die Idee hinter dieser Eingabe ein Suchfeld, ich glaube nicht, dass wir es alle Optionen anzeigen lassen können, wenn Sie einen Buchstaben eingeben:/ –