我正在使用materializecss为我的django网站提供一些实质性元素。我已经整理了一个表单(使用html的' old'方式),但现在意识到我需要使用django表单。问题是,这些形式不适合使用内置列系统的物化(它们使用类来确定行和列间距)。 Here是我到目前为止设置的布局示例。但是,当通过form.py定义表单时,它会为每个层吐出一个输入。
我的问题是:我可以做什么a)让django使用html定义的表单或b)制作一个表格模板'给输入字段提供适当的类?
如果你想查看我可以发布的代码,但我是一个很新的编码器,所以它太乱了。
谢谢!
答案 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()}
希望这会有所帮助。干杯!