2012-04-12 3 views
8

Sto avendo un piccolo (ma fastidioso) problema con i moduli django in questo momento.django crispy-forms & floppyforms w/bootstrap: come ottenere help_text in un ModelForm?

sto usando:

  • Twitter bootstrap
  • floppyforms Django (solo per i widget HTML5)
  • django croccanti forme (per i tag modello & rendering)
  • mie forme sono tutto ModelForms e che non dovrebbe cambiare se possibile

Ho cercato su tutto il web e ho provato un sacco di cose, ma non riesco a capire dove posso inserire help_text = "Un testo di aiuto casuale" nel codice. Quindi, ecco il mio codice (abbreviato per motivi di integrità):

#forms.py: 

import floppyforms as forms 
from crispy_forms.helper import FormHelper 
from crispy_forms.layout import * 
from crispy_forms.bootstrap import * 
from courses.models import * 

class CourseForm(forms.ModelForm): 
    class Meta: 
    model = Course 
    widgets = { 
     'title': forms.TextInput, # This is a floppyforms widget 
     ... 
    } 

    def __init__(self, *args, **kwargs): 
     self.helper = FormHelper() 
     self.helper.form_method = 'POST' 
     self.helper.form_id = '' 
     self.helper.form_class = 'form-horizontal' 
     self.helper.form_action = '' # redirect in the view 
     self.helper.form_tag = True 
     self.helper.help_text_inline = True # means that I want <span> elements 
     self.helper.layout = Layout(
      Fieldset('Create a new course', # fieldset label 
       Field('title', placeholder="Something...", css_class="span4"), 
       ... 
      ), 
      FormActions(
       Submit(
        'submit', 
        'Submit', 
        css_class="btn-primary" 
       ) 
      ), 
     ) 
     super(CourseForm, self).__init__(*args, **kwargs) 

ho cercato di iniettare come dict 'attrs' nel widget e come attr nel campo.

forms.TextInput(attrs={'help_text': 'Some help text'}) 
Field('title', help_text="Some help text", css_class="span4") 

Inutile dire che non ha funzionato. Ho bisogno di un gancio per inserire il testo della guida in uno 'span' o 'p' all'interno del mio controls-div, non nel widget di input.

Il mio modello è molto minimale e dovrebbe rimanere così se possibile. Non voglio per scorrere i campi del modulo:

#create_course.html 

{% extends 'base.html'%} 
{% load crispy_forms_tags %} 

{% block content%} 
{% crispy form %} 
{% endblock content%} 

che rende come il seguente codice HTML:

<div id="div_id_title" class="clearfix control-group"> 
    <label class="control-label requiredField" for="id_title"> 
    Title 
    <span class="asteriskField">*</span> 
    </label> 
    <div class="controls"> 
    <input id="id_title" class="span4 textinput textInput" type="text" placeholder="Something..." maxlength="60" required="" name="title"> 
    </div> 
</div> 

Con il testo di aiuto che dovrebbe assomigliare a questo:

<div id="div_id_title" class="clearfix control-group"> 
    <label class="control-label requiredField" for="id_title"> 
    Title 
    <span class="asteriskField">*</span> 
    </label> 
    <div class="controls"> 
    <input id="id_title" class="span4 textinput textInput" type="text" placeholder="Something..." maxlength="60" required="" name="title"> 
    **<span class="help-inline">Supporting help text</span>** 
    </div> 
</div> 

Qualsiasi aiuto è apprezzato! Non ho provato a iniettare il codice attraverso views.py nel modulo, ma non vedo alcun senso nel farlo. Dovrebbe essere possibile farlo in forms.py con il gancio destro e la sintassi.

Scusate per il lungo testo per un semplice problema così;)

+0

Ok, ho scoperto qual era il problema. Dal momento che non ho veramente definito i Campi ovunque (ho solo definito i widget di campo), non ho potuto accedere a help_text. È possibile definire i campi in forms.py (che non è necessario e non valido, sono ModelFields. DRY!) O impostare help_text per il modello in models.py. – tiwei

+0

Sono contento che tu abbia risolto il problema. Meglio specificare help_text nei modelli. Ma puoi anche sovrascrivere i campi senza ridefinirlo, vedi la diapositiva 34 qui https://speakerdeck.com/u/maraujop/p/advanced-django-forms-usage – maraujop

+1

Potresti postare il tuo commento come risposta e accettarlo? In questo modo non appare come una domanda senza risposta. –

risposta

8

ho scoperto quale fosse il problema. Dal momento che non ho veramente definito i Campi ovunque (ho solo definito i widget di campo), non ho potuto accedere a help_text. È possibile definire i campi in forms.py (che è inutile e in cattiva pratica, sono i ModelField dopo tutto) o impostare help_text per il modello in models.py.

La speranza che aiuta gli altri che hanno un problema simile.

+1

Solo per aggiungere a ciò, se per qualche motivo non si desidera utilizzare il testo della guida impostato nel modello, è sempre possibile accedere ai campi creati nel metodo '__init__' di ModelForm. –