Skip to content

Latest commit

 

History

History
75 lines (55 loc) · 2.35 KB

10. Django Forms.md

File metadata and controls

75 lines (55 loc) · 2.35 KB

Introduzione

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

Widget and Fields

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.

Forms subclass

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.

Model Fields

Sono campi (eg. dropdown) il cui contenuto dipende dal contenuto del modello. Possono essere popolati sulla base di una query.

Utilizzo

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

Creazione

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"
		

Crispy forms

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 }