Gå til innhold

Django: newforms biblioteket


Gjest Slettet-df17e

Anbefalte innlegg

Gjest Slettet-df17e

Jeg har den siste uka jobbet en del med Python, så har nå startet og se litt på Django.

Har et par spørsmål om newforms.

 

La oss si jeg har en model:

class Kunder(model.Model):
   kundenummer = models.IntegerField()
   navn = models.CharField()
   adresse = models=CharField()
   [...]

 

Så lager vi en klasse til formen ved hjelp av: FormClass = forms.form_for_model(Kunder)

 

1. Har man da noe mulighet for å eksludere f.eks "kundernummer" på noen måte ?

2. Hva om jeg ønsker "<input name="navn"><egendefinert html><input name="adresse">[...]" som output. Altså noen måte å manipulere html output fra FormClass?

3. Hvordan på en best mulig måte validere POST mot sql injections, xss, osv. ?

 

Kanskje ikke den beste forklaring, men det får gå :)

Det er også mulig fremgangsmåten min ikke er å fortrekke, så litt hjelp trenger jeg nå.

Lenke til kommentar
Videoannonse
Annonse

For å fjerne kundenummer kan du f.eks gjøre slik:

FormClass = forms.form_for_model(Kunder, fields=['navn', 'addresse'])

men hvis du har mange fields så er det kanskje lettere å gjøre det slik:

class KundeForm(forms.BaseForm):
   def __init__(self, data=None, auto_id='id_%s', prefix=None, initial=None):
       super(KundeForm, self).__init__(data, auto_id, prefix, initial)
       del self.fields['kundenummer']

FormClass = forms.form_for_model(Kunder, KundeForm)

 

for å få egen html kan du gjøre noe slikt som dette:

class KundeForm(forms.BaseForm):
   def __init__(self, data=None, auto_id='id_%s', prefix=None, initial=None):
       super(KundeForm, self).__init__(data, auto_id, prefix, initial)
       del self.fields['kundenummer']

   def as_myhtml(self):
       # Skriv din egen html her
       return self._html_output(u'<li>%(errors)s%(label)s %(field)s%(help_text)s</li>', u'<li>%s</li>', '</li>', u' %s', False) 

FormClass = forms.form_for_model(Kunder, KundeForm)

f = FormClass()
print f.as_myhtml()

 

eller i stenden for å printe hele formen på en gang kan du printe hvert enkelt field hver for seg, slik at du får det akkurat slik du vil.

f = FormClass()
print f['navn'].as_text()
print '<egendefinert html>'
print f['adresse'].as_widget() # her kan du bruke et eget custom widget hvis du vil.

#eller du kan printe alt selv:
print '<input type="text" value="%s" />' % f['name'].data # osv.

 

Sql injections tror jeg ikke du trenger å tenkt på, tror python tar seg av det så lenge du bruker det på riktig måte slik:

cur.execute("SELECT * FROM table WHERE f=%s", (var,))

og ikke slik:

sql = "SELECT * FROM t WHERE a=%s" % var

cur.execute(sql)

Men hvis du bruker django sitt orm så trenger du ikke gjøre slik som over.

 

Men for andre typer validering så kan du lage dine egne subclasser av forms.Field og bruke de i formsene dine.

 

Jeg har ikke testet noe av det over, så det er ikke sikkert det funker, men det finner du fort ut hvis du prøver.

Lenke til kommentar
Gjest Slettet-df17e

Takk for god hjelp, FraXinuS.

Jeg ser nå at django-dokumentasjon tar for seg dette i trunk-versonen. Jeg har kjørt på 0.96, derfor lest dokumentasjon til 0.96 også. Så har derfor gått over til trunk nå :)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...