Django: MultipleChoiceField in Admin tragen über zuvor gespeicherte Werte
Frage
ich Probleme habe zuvor ausgewählte Elemente in einer Modelform im Admin zu übertragen. Ich möchte, dass die forms.CheckboxSelectMultiple Widget verwenden, da dies die einfachste Benutzeroberfläche in diesem usecase ist. Es funktioniert so weit, dass beim Speichern werden die Werte gespeichert. Aber wenn die zuvor gespeicherte Artikel bearbeiten, zuvor die Werte in diesem Bereich gespeichert werden im Widget nicht reflektiert wird.
UI Beispiel:
Nach dem Eintrag (Bearbeitung dieses Elements, kehrt es leer):
Wenn jedoch nicht das Widget aber eine regelmäßige CharField zu verwenden, wenn das Element der Bearbeitung wie folgt aussieht:
So aus irgendeinem Grunde die Werte werden nicht durch die Checkbox-Widget dargestellt?
Hier ist meine vereinfachte Einrichtung, models.py
POST_TYPES = (
('blog', 'Blog'),
('portfolio', 'Portfolio'),
('beeldbank', 'Beeldbank'),
)
class Module(models.Model):
title = models.CharField(max_length=100, verbose_name='title')
entriesFrom = models.CharField(max_length=100)
def __unicode__(self):
return self.title
forms.py:
class ModuleForm(forms.ModelForm):
entriesFrom = forms.MultipleChoiceField(
choices=POST_TYPES,
widget=CheckboxSelectMultiple,
label="Pull content from",
required=False,
show_hidden_initial=True)
class Meta:
model = Module
def __init__(self, *args, **kwargs):
super(ModuleForm, self).__init__(*args, **kwargs)
if kwargs.has_key('instance'):
instance = kwargs['instance']
self.fields['entriesFrom'].initial = instance.entriesFrom
logging.debug(instance.entriesFrom)
admin.py
class ModuleAdmin(admin.ModelAdmin):
form = ModuleForm
Also, wenn Bearbeiten eines zuvor gespeicherten Artikel mit sagen 'Blog' ausgewählt haben, Debugging auf init zeigt mir die richtigen Werte auf self.fields [ 'entriesFrom'] ([u'blog‘]) , aber es ist nicht in den Kontrollkästchen spiegelt sich in der admin (nichts ist als ausgewählt gezeigt).
Bearbeiten
aktualisiert die ModuleForm Klasse auf Anfangswerte passieren, aber nichts bekommt immer noch bevölkerten vorbestellt, während es einige Werte in den Anfangswert sind ( „[u'blog ']“).
Lösung
Lösung:
Einstellen der Auswahl durch eine ganze Zahl ist, anstelle einer Zeichenfolge.
POST_TYPES = (
(1, 'Blog'),
(2, 'Portfolio'),
(3, 'Beeldbank'),
)
Verdammt, die nicht wert war meinen Schädel über zu brechen.
Andere Tipps
Vielleicht bin ich Ihre Frage nicht ganz verstehen, aber es scheint, wie Sie ein wenig vereinfachen könnte. Mit ModelForms, ich glaube nicht, alle Ihre zwingenden die _ init _ in der Form notwendig ist. Versuchen Sie dies und sehen Sie, wenn Sie Ihr gewünschtes Verhalten bekommen.
models.py
class Module(models.Model): POST_TYPES = ( ('blog', 'Blog'), ('portfolio', 'Portfolio'), ) title = models.CharField(max_length=100, verbose_name='title') entriesFrom = models.CharField(max_length=100, verbose_name='Pull content from', choices=POST_TYPES, blank=True) def __unicode__(self): return self.title
forms.py
class ModuleForm(forms.ModelForm): class Meta: model = Module
admin.py
from django.contrib import admin admin.site.register(models.Module)
Wenn meine Antwort ist nicht das, was Sie suchen, versuchen, Ihre Frage zu klären, und ich werde sehen, ob ich Ihnen helfen kann.