首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Django:如何使用自定义模板制作表单?

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

Stack Overflow用户
提问于 2011-02-05 03:56:32
回答 4查看 41.7K关注 0票数 23

我有一个模型:

代码语言:javascript
复制
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()

我想创建一个如下所示的表单:

代码语言:javascript
复制
<form method="POST" action="">
     {% for model in models %}
     <label>{{model.name}}</label> <input value='{{model.value}}' />
     <p>{{model.description}}</p>
     {% endfor %}
</form>

我不太确定该怎么做。也许我需要使用表单集?

代码语言:javascript
复制
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, {}))

然后在模板中,我希望以不同于默认的方式呈现表单。但是,我不太确定如何访问模型属性。这是正确的方法吗,或者我应该用另一种方法来做这件事?

更新:这就是我目前正在做的事情。除了样式之外,它完全按照我想要的方式呈现。然而,我觉得它太老土了:

代码语言:javascript
复制
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

代码语言:javascript
复制
{% 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 %}

有没有更好的方法来解决这个问题?

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

EN

回答 4

Stack Overflow用户

发布于 2011-02-05 06:57:48

代码语言:javascript
复制
<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

票数 21
EN

Stack Overflow用户

发布于 2011-02-05 04:49:30

我认为这里不需要表单集。如果您想要一个视图的自定义模板,请查看here。如果您想创建自己的{{ form.as_foobar }},只需创建forms.Form的子类,如下所示:

代码语言:javascript
复制
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中使用它:

代码语言:javascript
复制
class ContactForm(MyForm):
  # ..
票数 9
EN

Stack Overflow用户

发布于 2013-11-14 23:24:39

对于那些需要jbcurtin答案的<table>版本的人:

代码语言:javascript
复制
<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>
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4902333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档