Django:如何使用自定义模板制作表单? [英] Django: How to make a form with custom templating?

查看:43
本文介绍了Django:如何使用自定义模板制作表单?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个模型:

类设置(models.Model):元类:抽象 = 真name = models.CharField(max_length=120, primary_key=True)description = models.CharField(max_length=300, blank=True)类IntegerSetting(设置):值 = 模型.IntegerField()

我想创建一个类似于以下内容的表单:

{% 用于模型中的模型 %}<label>{{model.name}}</label><输入值='{{model.value}}'/><p>{{model.description}}</p>{% 结束为 %}</表单>

我不太确定如何去做.也许我需要使用表单集?

from django.forms.models import modelformset_factory从 apps.about.models 导入设置,IntegerSetting定义站点设置(请求):formset = modelformset_factory(IntegerSetting)()return render_to_response("about/admin/site-settings.html", {'formset': formset}, RequestContext(request, {}))

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

更新:这就是我目前正在做的事情.除了样式之外,它完全按照我的意愿呈现.但是,我觉得它很hacky:

class SettingsForm(ModelForm):元类:模型 = IntegerSettingdef as_table(self):bound_field = BoundField(self, self.fields['value'], 'value')return mark_safe("<tr><td><label>%s</label></td><td>%s
<p class='help'>%s</p></td></tr>" % (self.instance.name,self.instance.description,bound_field.__unicode__()))定义编辑设置(请求):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:

{% 扩展 "admin/base_site.html" %}{% 区块标题 %}系统设置{% endblock %}{% 块内容 %}<form method="post" action=""><表格>{% for form in forms %}{{形式}}{% 结束为 %}</表单>{% 结束块 %}

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

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

解决方案

{% 用于表单 %} 中的字段<div class="fieldWrapper">{{ field.errors }}{{ field.label_tag }}:{{ field }}

{% 结束为 %}<p><input type="submit" value="Send message"/></p></表单>

您可以在此处找到完整的文档:http://docs.djangoproject.com/en/dev/topics/forms/#customizing-the-form-template

I have a model:

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()

I would like to create a form that looks something like:

<form method="POST" action="">
     {% for model in models %}
     <label>{{model.name}}</label> <input value='{{model.value}}' />
     <p>{{model.description}}</p>
     {% endfor %}
</form>

I'm not quite sure how to go about doing this. Perhaps I need to use a 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, {}))

Then in the template, I'd want to render the form differently than default. I'm not quite sure how to go about accessing the model properties, however. Is this the right approach, or is there another way I should be going about doing this?

Update: This is what I'm currently doing. It renders exactly as I'd like it to, aside from the styling. However, I feel that it's deeply 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
<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 %}

Is there a better approach to this?

Also, I'm not sure if I'll encounter problems when the form is submitted or not.

解决方案

<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>

You can find the complete documentation here: http://docs.djangoproject.com/en/dev/topics/forms/#customizing-the-form-template

这篇关于Django:如何使用自定义模板制作表单?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆