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.
Django: Objekt vom Model bis ins Form-Widget übergeben...
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Hab die Lösung...
Ich mache ein eigenes ModelField, was so aussieht:
Es wird also immer ein eigenes Widget genutzt. Dem wird als Argument die Model-Klasse übergeben.
Das Widget sieht so aus:
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
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)
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)

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

- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
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
Das "filter" Agrument bei Tag.objects.cloud_for_model() kann man nun auch ändern. Siehe: https://github.com/jedie/django-tools/c ... 3c86#L5R26