2017-11-03 2 views
1

Mir wurde gesagt, dass es eine schlechte Form ist, local() zu verwenden, um Variablen dynamisch in Python zu erstellen. Allerdings schreibe ich eine Klasse (mit Django und Bachstelze), und ich brauche diese Dinge wirklich in der Klasse dict zu gehen, auch bekannt als die lokalen Variablen der class Anweisung, nicht in einer separaten Datenstruktur:Bessere Methode zum Erstellen von class-dict-Einträgen aus einer Schleife als local()

class BlogPage(Page): 
    for language in languages: 
     locals()['body_' + language] = RichTextField(blank=True) 

Ich glaube nicht, dass ich diese nach der Klassenanweisung auch mit setattr setzen kann, weil Djangos Metaklassen-Verarbeitung dann schon passiert ist.

Gibt es einen besseren Weg?

+0

Verwenden Sie ein Wörterbuch vielleicht. –

+0

... okay, für eine Klassenaussage, besonders wenn die Metaklasse irgendeine wichtige Arbeit leistet (was hier ziemlich wahrscheinlich ist), kann "localhips()" tatsächlich gerechtfertigt sein (und wird wahrscheinlich tatsächlich funktionieren, im Gegensatz zu 'localans()' in einer Funktion). – user2357112

+1

Der bessere Weg ist, dies überhaupt nicht zu tun und irgendeine Art von Behälter zu benutzen **. –

Antwort

1

Das Problem mit den verschiedenen Sprachen als Attribute des Modells besteht darin, dass das Ändern der Sprachen das Migrieren der Datenbank erfordert. Dies ist nicht etwas, was Sie jemals tun möchten, wenn Sie es helfen können.

Die korrekte Lösung besteht darin, ein separates Modell zu verwenden, das eine Seite und eine Sprache den entsprechenden Inhalten zuordnet.

class BlogPageTranslation(model.Model): 
    language = TextField() 
    blogpage = ForeignKey(BlogPage) 
    content = RichTextField() 

Dann, wenn die Abfrage der Seite sucht Übersetzungen mit der gewünschten Sprache und einem vernünftigen Standard, und dann die entsprechende Zeile nehmen.

xlatcontents = BlogPageTranslation.filter(blogpage=Page, 
    language__in=[someLanguage, 'en']) 
somethingsomething(xlatcontents, someLanguage) 
Verwandte Themen