Gjest Slettet-df17e Skrevet 20. august 2007 Skrevet 20. august 2007 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å.
FraXinuS Skrevet 20. august 2007 Skrevet 20. august 2007 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.
Gjest Slettet-df17e Skrevet 21. august 2007 Skrevet 21. august 2007 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å
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå