python - Django:如何使用自定义模板制作表单?

标签 python django django-templates django-forms

我有一个模型:

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, {}))

然后在模板中,我想以不同于默认的方式呈现表单。但是,我不太确定如何访问模型属性。这是正确的方法,还是我应该采取其他方法?

更新:这就是我目前正在做的事情。除了样式之外,它完全按照我的意愿呈现。但是,我觉得它非常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 %}

有更好的方法吗?

另外,我不确定提交表单时是否会遇到问题。

最佳答案

<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

关于python - Django:如何使用自定义模板制作表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4902333/

相关文章:

python - 在 Django 中引用多词模型对象

python - 如何使用 Iron python 加载 DLL?

python - 跨应用持久化测试数据

python - 如何使用 Apache Beam 从 Google Pub/Sub 访问消息 ID?

python - 多处理池,为列表中的每个项目在不同的目录中运行

Django - ImageField Blank=True 不起作用

javascript - HTML 无法在 Javascript 函数内部工作 - Django

python - 如何在我自己的 View 中使用 Django 管理列表和过滤?

python - 在django模板中渲染ManytoManyfield,而不复制父模型的内容

python - 整个 Django 项目中的空白 label_suffix