Esigenza di inserire logica di validazione o vincoli sul modello, come per esempio i tipi di caratteri ammessi sul form. Inoltre, volontà di generare automaticamente il front-end a partire dai vincoli del modello, in modo portabile.
#Vedi OpenTDB
JSON - Javascript Object Notation
Troviamo la libreria in questione all'interno dei moduli django.forms.(fields|widget)
.
Django associa un widget ad ogni field. Ogni field ha un widget perimpostato, ma l'utente ha la libertà di scegliere una differente associazione.
Estendendo da django.forms.Form
, posso definire un form:
class SearchForm(forms.Form):
CHOICE_LIST = [
("questions", "Search in questions"), # (option name, option label)
("choices", "Search in choices")
]
search_string = forms.CharField(label='Search String', max_length=100, min_length=3, required=True)
search_where = froms.ChoiceField(..., choices = CHOICE_LIST)
Raggiungibile mediante l'endpoint searchresults/<str:sstring>/<str:where>
Dall'endpoint di ricerca, gestito mediante function view, punto verso questo endpoint.
Sono campi (eg. dropdown) il cui contenuto dipende dal contenuto del modello. Possono essere popolati sulla base di una query.
class VoteForm(forms.Form): # Raggiungibile mediante /vote/<pk>
answer = forms.ModelChoiceField(queryset=None, required=True, ...)
def __init__(pk, *args, **kwargs):
super().__init(*args, **kwargs)
q =
#Ricorda sanitizza i dati form.cleaned_data.get("answer")
class CreateQuestionForm(forms.ModelForm):
description = "Create a new question!"
def clean(self): # Logica di validazoine
if (len(self.cleanded_data['questoin_text']) < 5):
self.add_error("question_text", "Question must longer than 5 chars"
Sono form creati con componenti Bootstrap.
Dipendenza dai seguenti pacchetti:
crispy_bootstrap = "*"
crispy_forms = "*"
Come rendere un form crispy? Utilizzo il crispy filter nel template: form | crispy
.
Oppure posso usare un helper per crispizzare il form a livello di classe.
class VoteFormCrispy(VoteForm):
helper = FormHelper()
helper.form_id = '...'
helper.form_method = 'POST'
helper.add_input(Submit("...", "..."))
Posso aggiungere il pulsante da questo lato.
Per renderizzare { crispy form }