Django ModelForm用法详解 —— Python

Django ModelForm是一种自动生成表单的工具,它是以模型为基础,在模型类上定义的表单。在使用Django ModelForm时,我们只需要指定模型类作为表单数据的基础,就可以自动地生成表单。下面是Django ModelForm用法的完整攻略。

创建ModelForm

首先,我们需要定义一个ModelForm。在创建ModelForm时,需要通过指定Meta类来定义ModelForm的一些元信息,如所使用的model、fields等,如下所示:

python 复制代码
​from django import forms
from myapp.models import MyModel

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = ['field1', 'field2', 'field3']

​

在上面的代码中,我们创建了一个名为MyModelForm的ModelForm,并定义了它的Meta类。该类指定了所使用的模型为MyModel,并明确了要使用的字段。

使用ModelForm渲染表单

在视图中,我们可以通过以下方式使用ModelForm来渲染一个表单:

python 复制代码
​def my_view(request):
    # 如果通过 POST 方法提交表单数据
    if request.method == 'POST':
        form = MyModelForm(request.POST)
        if form.is_valid():
            # 表单合法,则处理提交的数据
            form.save()
            return HttpResponseRedirect('/thanks/')

    # 如果不是 POST 方法提交,则创建一个空白的表单
    else:
        form = MyModelForm()

    return render(request, 'my_template.html', {'form': form})

​

在上面的代码中,我们尝试从请求中获取表单数据,如果发现表单的数据是有效的,那么就对其进行处理,否则就显示错误信息。如果请求类型不是POST,则直接生成一个空白的表单。

在模板中渲染表单

在上面的视图中,我们在调用render函数时向模板中传入了表单:{'form': form}。我们可以在模板中通过简单地调用表单的as_p()、as_table()或as_ul()方法来将表单渲染为HTML,如下所示:

python 复制代码
​<form method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Save</button>
</form>

​

在上面的HTML代码中,我们使用了form.as_p方法,将表单渲染成一个段落列表(即

标签)。

自定义表单的元素

除了自动生成表单外,Django ModelForm还允许我们向表单中添加自定义元素。我们可以在ModelForm的init()方法中添加自定义的字段,如下所示:

python 复制代码
​from django import forms
from myapp.models import MyModel

class MyModelForm(forms.ModelForm):
    my_field = forms.CharField(max_length=100, required=False)

    class Meta:
        model = MyModel
        fields = ['field1', 'field2', 'field3']

    def __init__(self, *args, **kwargs):
        super(MyModelForm, self).__init__(*args, **kwargs)
        self.fields['my_field'].label = "My field label"

​

在上面的代码中,我们向表单添加了一个自定义的字段my_field,它是一个CharField类型。在模板中,我们可以像处理其他字段那样,通过{{ form.my_field }}来使用自定义的字段。

自定义表单的验证

Django ModelForm还允许我们自定义表单的验证。我们可以通过覆盖ModelForm的clean()方法来实现自定义验证,如下所示:

python 复制代码
​from django import forms
from myapp.models import MyModel

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = ['field1', 'field2', 'field3']

    def clean(self):
        cleaned_data = super().clean()
        field1 = cleaned_data.get("field1")
        field2 = cleaned_data.get("field2")
        if field1 and field2:
            if field1 > field2:
                raise forms.ValidationError(
                    "Field1 cannot be greater than Field2"
                )

​

在上面的代码中,我们重写了ModelForm的clean()方法,并在其中定义了自定义验证逻辑,用于验证是否满足特定的条件。在这个例子中,我们验证了field1是否大于field2。

定义自定义的表单格式

最后,我们可以用widget属性自定义Django ModelForm的实例,来对表单进行格式化和样式的修改。例如我们可以添加一个自定义的style,如下所示:

python 复制代码
​from django import forms
from myapp.models import MyModel

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = ['field1', 'field2', 'field3']
        widgets = {
            'field1': forms.TextInput(attrs={'class': 'my-class'}),    
            'field2': forms.TextInput(attrs={
                'class': 'my-class',
                'style': 'color: red;'    
            }),    
        }

​

在上面的代码中,我们使用widget属性添加了自定义的样式,其中field1使用系统class "my-class"来定义样式;而field2则同时使用系统class和额外的自定义style,以达到自己所期望的效果。

总结

到这里,我们已经简单了解了Django ModelForm的用法,它可以自动生成表单,并允许我们对表单进行自定义,以满足我们的需求。但是需要注意,对于较复杂的表单,可能需要使用Django Forms或者自定义表单。

本次分享到此结束,觉得有所帮助的朋友点点关注点点赞!

相关推荐
这个DBA有点耶6 小时前
NULL不是空——数据库里最反直觉的设计,90%新人踩过的坑
数据库·mysql·代码规范
用户8356290780516 小时前
Python 实现 PDF 文件加密与解密方法
后端·python
用户8356290780516 小时前
使用 Python 冻结与拆分 Excel 窗格教程
后端·python
这个DBA有点耶8 小时前
AI写的SQL跑崩了生产库,这锅谁背?
数据库·人工智能·程序员
镜舟科技9 小时前
Databricks 再提 LTAP,AI 时代的数据底座为何重回大一统叙事?
数据库·架构·agent
Databend9 小时前
从湖仓升级为 Agent 时代的数据控制面,Snowflake 和 Databricks 有哪些布局
大数据·数据库·agent
ClouGence13 小时前
SQL Server CDC 能放到 Always On 备库读吗?一文讲透原理与实践
数据库·sql server
你好潘先生14 小时前
别再记命令了,用 yeero do 说句人话就能跑脚本,而且不烧 token
服务器·python·命令行
Agent_大师15 小时前
WebSocket 行情重连成功,K线缺口不会自动消失
python
荣码15 小时前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python