Python Django表单,用于指示输入类型

Python Django表单,用于指示输入类型,python,django,forms,django-forms,Python,Django,Forms,Django Forms,另一个我担心的基本问题,我正在努力解决。我浏览了各种Django文档页面,也搜索了这个网站。我在这里发现的唯一一件事是在2013年,当时建议设置自定义过滤器模板 无论如何,我正在尝试生成我自己的表单,而不是使用Django自己通过{{form}生成表单的方式。这很简单,因此我可以控制表单的显示方式 我已经制定了各种方法来访问所需的信息,例如(在我的for item in form循环中) item.help\u文本 item.label_标签 item.id_用于_标签 我正在尝试识别项目类

另一个我担心的基本问题,我正在努力解决。我浏览了各种Django文档页面,也搜索了这个网站。我在这里发现的唯一一件事是在2013年,当时建议设置自定义过滤器模板

无论如何,我正在尝试生成我自己的表单,而不是使用Django自己通过{{form}生成表单的方式。这很简单,因此我可以控制表单的显示方式

我已经制定了各种方法来访问所需的信息,例如(在我的for item in form循环中)

  • item.help\u文本
  • item.label_标签
  • item.id_用于_标签
我正在尝试识别项目类型,以便使用正确的输入类型,但是我正在努力确定item.xxxx应该是什么。因为这是通过{{form}正确显示的,所以我假设这个信息在表单中的某个地方是可用的,只是努力找出如何访问它,以便识别正确的输入类型。我正在手动执行此操作,以便使用正确的引导样式来显示输入字段

任何帮助都将不胜感激(或只是指向正确的方向)。我对这一点很陌生,所以为我的基本问题道歉,没有认识的人我很难去问这些问题

问候

韦恩

不确定您是否需要它,但这里有一些代码

表格:

视图(尚未在POST位上工作,这只是Django文档中的内容,POST是我下一步要做的事情)

模板代码

<form action="/siteadmin/{{ branding.dataset }}" method="post">
    {% csrf_token %}
    {% for item in form %}
        <div class="row">
            <div class="col-xs-2 col-md-2">
            </div>
            <div class="col-xs-4 col-md-4">
                <div class="panel-title pull-right">
                    {% if item.help_text %}
                      <img src="/static/images/info.png" height="20" width="20" aria-hidden="true" data-toggle="popover" title="{{ item.help_text }}">&nbsp
                    {% endif %}
                    {{ item.label_tag }}
                </div>
            </div>
            <div class="col-xs-4 col-md-4">
                <div class="input-group">       
                    <input type="{{ item.widget }}" class="form-control" placeholder="" aria-describedby="{{ item.id_for_label }}">
                </div>
            </div>
            <div class="col-xs-2 col-md-2">
                {% if forloop.last %}
                    <input type="submit" value="Submit" />
                {% endif %}
            </div>          
        </div>
    {% endfor %}
</form>

{%csrf_令牌%}
{%表格%中的项目为%1}
{%if item.help_text%}
 
{%endif%}
{{item.label_tag}}
{%if-forloop.last%}
{%endif%}
{%endfor%}
试试这个:

<input type="{{ item.field.widget.input_type }}" ...

这是错误的做法。您在这里所做的定制都是针对输入的属性,这些都是在表单类本身中完成的

class NewsForm(ModelForm):
    news_title = forms.CharField(widget=forms.TextInput(
        attrs={'class': 'form-control', 'placeholder': 'whatever', label: ('Enter News Title')})
现在你可以做:

<div class="input-group">       
    {{ item }}
</div>
如果重复太多,您可以直接在表单的
\uuuu init\uuu
方法中修改属性:

class NewsForm(ModelForm):
    def __init__(self, *args, **kwargs)
        super(NewsForm, self).__init__(*args, **kwargs)
        for field in self.fields.values():
            field.widget.attrs['class'] = 'form-control'

请不要使用此选项-此选项不会出现在所有
小部件上。例如,它不会出现在
Select
小部件上。创建自定义小部件是正确的答案。再次感谢@frnhr的回复。有趣的是,复选框似乎不起作用。Item.field.widget将复选框项目列为感谢DanielB。注意到了。如果我使用模型创建表单,您是否有一个指向如何创建自定义小部件的指南的链接。除非我误解了Django指南中的某些内容,否则在从头开始创建表单时,需要创建自定义小部件。对于我目前正在做的项目来说,手工操作并没有太大问题,但是我的下一个项目将有很多表单字段。谢谢,Waynet@Daniel Roseman给出的答案应该适合您,如果您仍然需要创建自定义小部件,您可以使用
小部件
属性,就像您使用
标签
帮助文本
。。。在
Meta
类中。@Smurf查看我答案中的链接,它准确地显示了如何向小部件添加属性。感谢daniel roseman的回复。我确实想过这样做,但是这不允许您将表单建立在模型的基础上,这就是我上面所做的。令人沮丧的是,Django没有提供手动创建表单所需的属性(也就是说,我找不到方法来检测该字段的输入类型,因此我可以更多地自定义我的输入类型。我不理解你的评论。这完全是基于模型的;你所做的唯一一件事就是覆盖
新闻标题
字段。你甚至可以通过在元数据中定义
小部件
字典来自定义小部件本身类。抱歉,丹尼尔,我弄糊涂了。你们的类不是手动为新闻表单创建表单字段吗?这就是我重播的意思。我的类有Meta:model=News\u Article,所以我不需要定义每个字段和数据类型。当使用已经定义的模型时,我做得不对吗?
<div class="input-group">       
    {{ item }}
</div>
class Meta:
    model = News_Article
    widgets = {
        'news_title': forms.TextInput(attrs={'class': 'form-control'})
    }
class NewsForm(ModelForm):
    def __init__(self, *args, **kwargs)
        super(NewsForm, self).__init__(*args, **kwargs)
        for field in self.fields.values():
            field.widget.attrs['class'] = 'form-control'