19 Stimmen

Wie fügt man Attribute zu Optionstags hinzu?

Ich muss das Attribut title zu den Optionen des ModelChoiceFields hinzufügen. Hier ist mein Admin-Code für das:

class LocModelForm(forms.ModelForm):
        def __init__(self,*args,**kwargs):
            super(LocModelForm,self).__init__(*args,**kwargs)
            self.fields['icons'] = forms.ModelChoiceField(queryset = Photo.objects.filter(galleries__title_slug = "markers"))
            self.fields['icons'].widget.attrs['class'] = 'mydds'

        class Meta:
            model = Loc
            widgets = {
                'icons' : forms.Select(attrs={'id':'mydds'}), 
                }

        class Media:
            css = {
                "all":("/media/css/dd.css",)
                }
            js=(
                '/media/js/dd.js',
                )

class LocAdmin(admin.ModelAdmin):
    form = LocModelForm

Ich kann dem Select-Widget jedes beliebige Attribut hinzufügen, aber ich weiß nicht, wie man Attribute zu Optionstags hinzufügt. Irgendeine Idee?

1voto

Vlad Punkte 1188

Ab django 1.11 und höher wird die render_option Methode wurde entfernt. siehe diesen Link: https://docs.djangoproject.com/en/1.11/releases/1.11/#changes-due-to-the-introduction-of-template-based-widget-rendering

Hier ist eine Lösung, die bei mir anders funktioniert hat als die von Kayoz. Ich habe die Namen nicht wie im Beispiel angepasst, aber ich hoffe, es ist trotzdem klar. In dem Modellformular überschreibe ich das Feld:

class MyForm(forms.ModelForm):
    project = ProjectModelChoiceField(label=_('Project'), widget=ProjectSelect())

Dann deklariere ich die Klassen von oben und eine zusätzliche, den Iterator:

class ProjectModelChoiceIterator(django.forms.models.ModelChoiceIterator):
    def choice(self, obj):
        # return (self.field.prepare_value(obj), self.field.label_from_instance(obj)) #it used to be like this, but we need the extra context from the object not just the label. 
        return (self.field.prepare_value(obj), obj)

class ProjectModelChoiceField(django.forms.models.ModelChoiceField):
   def _get_choices(self):
       if hasattr(self, '_choices'):
           return self._choices
       return ProjectModelChoiceIterator(self)

class ProjectSelect(django.forms.Select):

    def create_option(self, name, value, label, selected, index, subindex=None, attrs=None):
        context = super(ProjectSelect, self).create_option(name, value, label, selected, index, subindex=None, attrs=None)

        context['attrs']['extra-attribute'] = label.extra_attribute #label is now an object, not just a string.
        return context

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X