Ho un modello:Django: come creare un modulo con template personalizzati?
class Setting(models.Model):
class Meta:
abstract = True
name = models.CharField(max_length=120, primary_key=True)
description = models.CharField(max_length=300, blank=True)
class IntegerSetting(Setting):
value = models.IntegerField()
Vorrei creare un modulo che sembra qualcosa di simile:
<form method="POST" action="">
{% for model in models %}
<label>{{model.name}}</label> <input value='{{model.value}}' />
<p>{{model.description}}</p>
{% endfor %}
</form>
io non sono del tutto sicuro di come andare a fare questo. Forse ho bisogno di usare un formset?
from django.forms.models import modelformset_factory
from apps.about.models import Setting, IntegerSetting
def site_settings(request):
formset = modelformset_factory(IntegerSetting)()
return render_to_response("about/admin/site-settings.html", {'formset': formset}, RequestContext(request, {}))
Quindi nel modello, vorrei rendere il modulo in modo diverso rispetto al valore predefinito. Non sono abbastanza sicuro di come accedere all'accesso alle proprietà del modello, comunque. È questo l'approccio giusto, o c'è un altro modo in cui dovrei fare per farlo?
Aggiornamento: questo è ciò che sto facendo attualmente. Rende esattamente come mi piacerebbe, a parte lo stile. Tuttavia, ritengo che sia profondamente hacky:
class SettingsForm(ModelForm):
class Meta:
model = IntegerSetting
def as_table(self):
bound_field = BoundField(self, self.fields['value'], 'value')
return mark_safe("<tr><td><label>%s</label></td><td>%s\n<p class='help'>%s</p></td></tr>" % (self.instance.name,
self.instance.description,
bound_field.__unicode__()))
def edit_settings(request):
forms = [SettingsForm(instance=intSetting) for intSetting in IntegerSetting.objects.all()]
return render_to_response("admin/edit-settings.html", {'forms': forms}, RequestContext(request, {}))
edit-settings.html:
{% extends "admin/base_site.html" %}
{% block title %}System Settings{% endblock %}
{% block content %}
<form method="post" action="">
<table>
{% for form in forms %}
{{form}}
{% endfor %}
</table>
</form>
{% endblock %}
C'è un approccio migliore a questo?
Inoltre, non sono sicuro se incontrerò problemi quando il modulo viene inviato o meno.
E come avrei ottenuto i risultati del 'as_foobar' nel modello? –
Inoltre, questo sta specificando l'output a livello di campo, giusto? Quello di cui ho bisogno è: "Model.name.value: Model.value.value (Model.description.value)" –
Userai {{form.as_foobar}} (simile a form.as_p) nel modello. Sostituisci "modulo" con qualunque sia la tua variabile di forma chiamata. –