在Django中指定特定的表单格式

时间:2016-04-28 13:49:15

标签: django forms

我正在使用materializecss为我的django网站提供一些实质性元素。我已经整理了一个表单(使用html的' old'方式),但现在意识到我需要使用django表单。问题是,这些形式不适合使用内置列系统的物化(它们使用类来确定行和列间距)。 Here是我到目前为止设置的布局示例。但是,当通过form.py定义表单时,它会为每个层吐出一个输入。

我的问题是:我可以做什么a)让django使用html定义的表单或b)制作一个表格模板'给输入字段提供适当的类?

如果你想查看我可以发布的代码,但我是一个很新的编码器,所以它太乱了。

谢谢!

1 个答案:

答案 0 :(得分:0)

我可以通过三种方式来思考。

如果要完全控制HTML表单,在Django模板或HTML表单中,只需映射字段的名称以匹配Django表单中的基础字段名称。这样,当POST回到你的视图时,Django会自动将POSTed字段与Django表单字段链接起来。

例如,如果你的Django表单中有一个字段username(或者如果使用ModelForm就有Django模型),你可以有一个元素<input type="text" name="username" maxlength="40">(你可以按照你需要的方式设置)您的HTML表单,Django将很乐意解析到您的Django表单字段,假设您的视图正确检测。 There is an example of this method in the Django documentation.

另一种方法是在Django表单定义中自定义Django表单字段小部件。 The Django documentation talks a little bit about how to do this。这对于一次性非常有用,但如果您希望重用小部件,则可能不是最好的方法。

最后一种方法是将Django表单字段小部件子类化,以自动提供您需要的任何属性。例如,我们使用Bootstrap并将几乎所有用于利用Bootstrap类的小部件子类化。

class BootstrapTextInput(forms.TextInput):
    def __init__(self, attrs=None):
        final_attrs = {'class': 'form-control'}
        if attrs is not None:
            final_attrs.update(attrs)
        super().__init__(attrs=final_attrs)

然后,只需让Django表单知道哪个小部件用于表单字段。

class UsernameForm(forms.ModelForm):
    class Meta:
        model = auth.get_user_model()
        fields = ['username']
        widgets = {'username': BootstrapTextInput()}

希望这会有所帮助。干杯!