私はモデルを持っています:
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()
次のようなフォームを作成したいと思います。
<form method="POST" action="">
{% for model in models %}
<label>{{model.name}}</label> <input value='{{model.value}}' />
<p>{{model.description}}</p>
{% endfor %}
</form>
私はこれをどうやってやるかについてよくわかりません。おそらくフォームセットを使用する必要がありますか?
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, {}))
次に、テンプレートで、フォームをデフォルトとは異なる方法でレンダリングしたいと思います。ただし、モデルのプロパティにアクセスする方法はよくわかりません。これは正しいアプローチですか、それともこれを実行する別の方法がありますか?
更新:これは私が現在行っていることです。スタイリングを除いて、私が思い通りにレンダリングされます。しかし、私はそれは非常にハッキーだと感じています:
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 %}
これへのより良いアプローチはありますか?
また、フォームの送信時に問題が発生するかどうかもわかりません。
<form action="/contact/" method="post">
{% for field in form %}
<div class="fieldWrapper">
{{ field.errors }}
{{ field.label_tag }}: {{ field }}
</div>
{% endfor %}
<p><input type="submit" value="Send message" /></p>
</form>
完全なドキュメントはここにあります: http://docs.djangoproject.com/en/dev/topics/forms/#customizing-the-form-template
ここではフォームセットは必要ないと思います。 1つのビューにカスタムテンプレートが必要な場合は、 ここ をご覧ください。独自の{{form.as_foobar}}を作成する場合は、次のようなform.Formをサブクラス化します。
class MyForm(forms.Form):
def as_foobar(self):
return self._html_output(
normal_row = u'%(label)s %(field)s%(help_text)s',
error_row = u'%s',
row_ender = '',
help_text_html = u' %s',
errors_on_separate_row = False)
そしてあなたのforms.pyでそれを使用してください:
class ContactForm(MyForm):
# ..
<table>
jbcurtinの回答のバージョン:
<form method="post">{% csrf_token %}
<table>
{% for field in form %}
<tr>
<th>{{field.label_tag}}</th>
<td>
{{ field.errors }}
{{ field }}
</td>
</tr>
{% endfor %}
</table>
<hr/>
<input type="submit" value="Conferma" />
</form>
Django-floppyforms ( docs )に興味を持っているようです。これにより、フィールドのレンダリングをより詳細に制御できます。