2011-01-22 5 views
5

Chcę pokazać pole modelu help_text jako atrybut HTML title w formularzu, zamiast dołączać go do końca wiersza, tak jak to jest domyślne.Czy można wyświetlić tekst pomocy modelu jako atrybut tytułu na formularzach w Django?

Podobają mi się wszystkie informacje o modelu Pole znajdujące się w jednym miejscu (w samej definicji Modelu), a zatem nie chciałbym określać niestandardowego title dla każdego widżetu. Jest jednak w porządku, jeśli istnieje sposób na określenie, że atrybut title każdego z widgetów powinien być równy wartości help_text. Czy to jest możliwe? Szukam czegoś do skutku:

widgets = {'url':TextInput(attrs={'title': help_text})} 

Jedynym sposobem mogę myśleć w ten sposób, jest uczynienie niestandardowych widżety dla każdego jednego z wbudowanych typów widget. Czy istnieje łatwiejszy, leniwszy sposób na osiągnięcie tego samego efektu?

Używanie Javascriptu jest również opcją, ale to byłby naprawdę bardzo odległy środek ostateczny. Myślę, że to musi być raczej powszechny przypadek użycia; jak sobie z tym poradziliście w przeszłości?

Odpowiedz

3
Model._meta.get_field('field').help_text 

W twoim przypadku

widgets = {'url':TextInput(attrs={'title': Model._meta.get_field('url').help_text})} 
+0

Neat, nie wiedziałem, że. Co powiesz na ukrycie "help_text" tak, aby było wyświetlane tylko w tytule? –

+0

Chcesz ukryć to w formularzu? po prostu utwórz własną niestandardową formę http://docs.djangoproject.com/en/dev/topics/forms/#customizing-the-form-template – errx

+0

Tak, masz rację. Pętla nad polami formularza może załatwić sprawę. Dzięki! –

2

Oto kolejny sposób przy użyciu dekorator klasy.

def putHelpTextInTitle (cls): 
    init = cls.__init__ 

    def __init__ (self, *args, **kwargs): 
     init(self, *args, **kwargs) 
     for field in self.fields.values(): 
      field.widget.attrs['title'] = field.help_text 

    cls.__init__ = __init__ 
    return cls 

@putHelpTextInTitle 
class MyForm (models.Form): 
    #fields here 

Klasa dekorator jest adaptacją here

+0

Nice. Dodaj 'field.help_text = None' na końcu pętli' for', aby uniknąć dwukrotnego wyświetlania przez Django 'help_text'. – SaeX