Seite 1 von 1

Django: Objekt vom Model bis ins Form-Widget übergeben...

Verfasst: Dienstag 7. Dezember 2010, 17:46
von jens
Ich möchte gern ein netteres Form-Widget für ein django-tagging field machen. Genauer gesagt, soll erst mal nur eine Tag-Cloud unter dem Eingabefeld sein. (In JavaScript kann man dann ja die Tags klick bar machen, um sie in das Eingabefeld zu übernehmen)

Am liebsten würde ich es so machen, das es reicht in seinem Model statt dem original tagging.fields.TagField ein anderes zu nehmen und fertig. So das man dann ModelForm verwenden kann, ohne was anzupassen...

Dazu muss man aber vom Model bis in die render() Methode vom Form-Widget Informationen übergeben können. Genauer gesagt, brauche ich die Model-Klasse, um daraus dann eine Tag-Cloud zu generieren. Aber wie macht man das?

Ich habe schon http://code.google.com/p/django-tagging-autocomplete/ gefunden. Aber das gefällt mir nicht. Es wird dabei einfach alle vorhanden Tags angeboten. Also nicht gefiltert auf das wirklich genutzte Model und somit ganz ohne Gewichtung.

Re: Django: Objekt vom Model bis ins Form-Widget übergeben..

Verfasst: Mittwoch 8. Dezember 2010, 13:22
von jens
Hab die Lösung...

Ich mache ein eigenes ModelField, was so aussieht:

Code: Alles auswählen

class jQueryTagModelField(TagField):
    def formfield(self, **kwargs):
        kwargs['widget'] = jQueryTagFieldWidget(self.model)
        return super(jQueryTagModelField, self).formfield(**kwargs)
Es wird also immer ein eigenes Widget genutzt. Dem wird als Argument die Model-Klasse übergeben.
Das Widget sieht so aus:

Code: Alles auswählen

class jQueryTagFieldWidget(TextInput):
    def __init__(self, tag_model, *args, **kwargs):
        self.tag_model = tag_model
        super(jQueryTagFieldWidget, self).__init__(*args, **kwargs)

    def render(self, name, value, attrs=None):
        html = super(jQueryTagFieldWidget, self).render(name, value, attrs)
        tag_cloud = Tag.objects.cloud_for_model(self.tag_model, steps=2)
        context = {
            "html": html,
            "tag_cloud": tag_cloud,
            "field_id": attrs['id'],
        }
        return render_to_string("tagging_addon/jQueryTagField.html", context)
Die komplette Sache wird bald in meinen django-tools Projekt sein ;)

z.Z. Frage ich mich noch, wie man dem Tag.objects.cloud_for_model noch QuerySet-Filter unter jubeln könnte... Denn ich hätte gern nur die Tags in der Aktuellen Sprache ;)

Re: Django: Objekt vom Model bis ins Form-Widget übergeben..

Verfasst: Mittwoch 8. Dezember 2010, 15:44
von jens
Das ganze sieht nun so aus: https://github.com/jedie/django-tools/c ... 41fa193c86

Das "filter" Agrument bei Tag.objects.cloud_for_model() kann man nun auch ändern. Siehe: https://github.com/jedie/django-tools/c ... 3c86#L5R26