Django: Objekte aus Strings heraus suchen zwecks dynamischer Ajax Nutzung

Tags: django, ajax, python, jquery

Um nicht für jeden Pups eine eigene Ajax Anbindung schreiben zu müssen, versuche ich meine Libs einigermaßen universell zu programmieren.

Hierbei bietet es sich definitiv an, den einzelnen Objekten die gleichen Eigenschaften zukommen zu lassen, selbst wenn die Namensgebung dann möglicherweise leicht am Inhalt vorbei geht. So verzichte ich in altuellen Projekten stets auf ein Feld Beschreibung und nenne es statt dessen "name" (wie üblicherweise auch in englischsprachigen Tutorials).

Nun habe ich ein HTML Template, welches mir folgendes bastelt:

<div class="container" style="float: left">
   <div class="fixwidth suchdiv">Bereich: <input id="Bereich" class="suchtext"></div><br>
   <div class="fixwidth suchdiv">Gerätetyp: <input id="Geraetetyp" class="suchtext"></div><br>
   <div class="fixwidth suchdiv">Hersteller: <input id="Hersteller" class="suchtext"></div><br>
   <div class="fixwidth suchdiv">Lieferant: <input id="Lieferant" class="suchtext"></div><br>
</div>

Diese Inputs werden mit jQueryUI gestyled und anschließend per jQuery abgefragt und starten den Ajax Kram:

$( ".suchtext" ).change(function() {
   $.post("/ajx_get", {
      action: "object",
      objclass: $(this).attr('id'),
      term: $(this).val()
   },
   function(data) {
      //alert(data);
      $('#ergebnisse').html(data);
   })
});

Und damit das auch immer funktioniert und nicht nur manchmal:

$('.suchtext').keyup(function() {
   $(this).change();
});

Nun kommt der Serverseitige Krempel ins Spiel:

if(mx['action']=="object"):
   term = mx['term']
   objclass = mx['objclass']
   objcls = find_class(objclass)
   rueck = objcls.objects.filter(Q(name__contains = term))
   return render_to_response('snippets/suchergebnis-objekt.html', locals())

Der Clou liegt darin, daß sich in Python aus einem String ein Objekttyp / eine Klasse bauen lässt. Dies geschieht durch Aufruf der folgenden Funktion:

def find_class(str):
   return getattr(sys.modules[__name__], str)

Und richtig chic finde ich die Möglichkeit, dann anschließend mit nur einem Template quasi beliebige Objekte im Suchergebnis anzeigen zu lassen und anklickbar z.B. einer Ausgabe hinzufügen zu lassen.

Die Arbeit hierfür übernimmt das Templating von Django, gepaart mit ein ganz klein wenig jQuery:

{% for b in rueck %}
   <p name="{{ objclass }}" id="{{ b.id }}" class="fixwidth objekt button">{{ b.id }} - {{ b.name }}</p><br>
{% endfor %}

<script>
   $('.objekt').click( function() {
         ausgabe = "<br>" + $(this).attr('name') +": ID " + $(this).attr('id') + " " + $(this).html();
         console.log(ausgabe);
         $('#objekt').append(ausgabe);
   });
</script>

Also insgesamt quasi 30 Zeilen, mit denen man die Welt erobern kann.


Kommentare (0)

Dieser Thread wurde geschlossen.

Tags

  • Fotografie (3)
  • django (3)
  • python (2)
  • linux (2)
  • Photoshop (2)
  • syncdb (1)
  • jquery (1)
  • django_evolution (1)
  • easy_install (1)
  • sqlite3 (1)

  • Social Kram