Seite 1 von 1

[django] Automatisches escapen von Tabelleneinträgen...

Verfasst: Mittwoch 14. November 2007, 09:25
von jens
Ich möchte gern beim Zugriff auf ein Model Attribut, den Wert escapen...

Eine Möglichkeit die mir spontan einfällt, wäre das ganze mit properties zu machen... Mal ein Beispiel:

Normalerweise sieht mein Model so aus:

Code: Alles auswählen

class Page(models.Model):
    ...
    name = models.CharField()
    ...
Das ganze hab ich mal versucht zu ändern in:

Code: Alles auswählen

class Page(models.Model):
    ...
    __name = models.CharField(
        db_column='name'
    )
    def __get_name(self):
        return escape(self.__name)

    def __set_name(self, data):
        self.__name = data

    name = property(__get_name, __set_name)    
    ...
Ich versuche also die Datenbankstruktur nicht zu ändern, deswegen gebe ich mit db_column die den alten Namen an...

Das ganze funktioniert allerdings so nicht ganz :(
Ich erhlate eine Exception "Page has no field named 'name'" wenn ich mit objects.values arbeite...

Hier ein Beispiel:

Code: Alles auswählen

from PyLucid.models import Page

# geht:
page = Page.objects.all()[0]
print page.name

# geht nicht:
print Page.objects.values("name")
Ausgabe:

Code: Alles auswählen

Traceback (most recent call last):
  File "/home/jens/workspace/PyLucid_trunk/dev_scripts/local_tests/PyLucid_shortcuts_test.py", line 24, in <module>
    print Page.objects.values("name")
  File "/home/jens/workspace/PyLucid_trunk/pylucid/django/db/models/query.py", line 108, in __repr__
    return repr(self._get_data())
  File "/home/jens/workspace/PyLucid_trunk/pylucid/django/db/models/query.py", line 482, in _get_data
    self._result_cache = list(self.iterator())
  File "/home/jens/workspace/PyLucid_trunk/pylucid/django/db/models/query.py", line 597, in iterator
    fields = [self.model._meta.get_field(f, many_to_many=False) for f in self._fields]
  File "/home/jens/workspace/PyLucid_trunk/pylucid/django/db/models/options.py", line 131, in get_field
    raise FieldDoesNotExist, '%s has no field named %r' % (self.object_name, name)
django.db.models.fields.FieldDoesNotExist: Page has no field named 'name'
Ob das ein Bug in django ist???


Zum Hintergrund:
Wie mir nun aufgefallen ist, kann ich in PyLucid nicht einfach in einen Seitennamen HTML Entries benutzten.

Klar kann man das tun, aber momentan werden die Seitenamen nicht escaped. Was aber nötig ist, wenn ich z.B. eine Seite mit dem Namen >wichtig< erstellen möchte...

Eine Möglichkeit ist es, an jeder Stelle wo der Seitenname "ausgegeben" wird, diesen dann zu escapen. Doch da gibt es einige Stellen wo man dieses machen müßte.
Richtig Haarig wird es dann, wenn man Newforms verwendet, da es dann nicht wirklich einfach ist, ein Model Daten Eintrag im nachhinein zu escapen. Hab ich zwar auch hinbekommen, aber das verlangt einiges an zusätzlichen Code...

Verfasst: Mittwoch 14. November 2007, 14:48
von jens
Hatte zeitgleich mal auf django.users nachgefragt: http://groups.google.com/group/django-u ... 48ccd2630e

Also das verhalten ist normal :(

Vielleicht sollte ich das anders angehen...