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;)
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
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
Czy możesz opublikować swój komentarz jako odpowiedź i zaakceptować go? W ten sposób nie pojawia się jako pytanie bez odpowiedzi. –