2012-04-12 6 views
8

Mam teraz mały (ale denerwujący) problem z formularzami django.django crispy-form & floppyforms w/bootstrap: jak uzyskać help_text w ModelForm?

Używam:

  • twitter bootstrap
  • floppyforms Django (tylko dla widgetów HTML5)
  • django chrupiące formularze (dla tagów szablonu & rendering)
  • moje postacie są wszystkie ModelForms i że nie powinno się zmieniać, jeśli to możliwe

Przeszukałem całą sieć i próbowałem wielu rzeczy, ale nie mogę znaleźć miejsca, w którym mogę wstrzyknąć help_text = "Some losowy tekst pomocy" do kodu. Więc tutaj jest mój kod (w skrócie powodów Sanity):

#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) 

Próbowałam wstrzyknąć go jako dict w widgecie „attrs” i jako attr na pole.

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

Nie trzeba dodawać, że to nie zadziałało. Potrzebuję haka, aby umieścić tekst pomocy w "span" lub "p" wewnątrz kontrolek-div, a nie w widgecie wejściowym.

Mój szablon jest bardzo minimalny i powinien pozostać taki, o ile to możliwe. Nie chcę iteracyjne nad pól formularza:

#create_course.html 

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

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

To świadczy, jak następujący kod 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> 

z tekstem pomocy powinna wyglądać następująco:

<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> 

Każda pomoc jest doceniana! Nie próbowałem wstrzykiwać kodu przez views.py do formularza, ale nie widzę sensu w tym. Powinno to być możliwe w forms.py z odpowiednim hakiem i składnią.

Przepraszamy za długi tekst takiego prostego problemu;)

+0

Ok Dowiedziałem się, na czym polega problem. Ponieważ tak naprawdę nie zdefiniowałem Fieldów w dowolnym miejscu (zdefiniowałem tylko widżety pól), nie mogłem uzyskać dostępu do tekstu help_text. Możesz zdefiniować Pola w forms.py (co jest niepotrzebne i złą praktyką, są to ModelFields. DRY!) Lub ustawić tekst help_text dla modelu w models.py. – tiwei

+0

Cieszę się, że to załatwiłeś. Lepiej określić tekst pomocy w modelach. Ale możesz także zastąpić pola bez przedefiniowania go, zobacz slajd 34 tutaj https://speakerdeck.com/u/maraujop/p/advanced-django-forms-usage – maraujop

+1

Czy możesz opublikować swój komentarz jako odpowiedź i zaakceptować go? W ten sposób nie pojawia się jako pytanie bez odpowiedzi. –

Odpowiedz

8

dowiedziałem się na czym polega problem. Ponieważ tak naprawdę nie zdefiniowałem Fieldów w dowolnym miejscu (zdefiniowałem tylko widżety pól), nie mogłem uzyskać dostępu do tekstu help_text. Możesz zdefiniować pola w forms.py (co jest niepotrzebne i złe praktyki, mimo wszystko są one modelFields) lub ustawić tekst help_text dla modelu w models.py.

Nadzieję, że pomaga innym, którzy mają podobny problem.

+1

Aby dodać do tego, jeśli z jakiegoś powodu nie chcesz używać tekstu pomocy ustawionego w modelu, zawsze możesz uzyskać dostęp do utworzonych pól w metodzie '__init__' ModelForm. –

Powiązane problemy