Django ModelForm中保存数据 save()与create()的区别

博客介绍了与Python和Django相关的两种方法,虽未详细说明方法内容,但聚焦于这两个信息技术领域的关键元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法一 form.save()

save()方法可以直接保存所需要的数据,自动剔除数据库中不需要的数据 例如:数据库中有username、password、email、phone四个字段。而注册页面则需要输入username、password、re_password、email、phone、code这六个数据。save()则会在保存时剔除多余的数据。

if form.is_valid():
    form.save()

方法二 models.User.objects.create(**form.cleaned_data)

如果直接用此方法保存数据的话是会报错的。原因是它会将注册页面中的所有数据都保存进数据库,但是数据库中却没有对应字段。因此使用此方法需要先剔除不需要的数据。

if form.is_valid():
    data = form.cleaned_data  # 拿到校验后的所有数据
    data.pop('code')  # 剔除不需要保存到数据库的数据
    data.pop('re_password')
    models.User.objects.create(**data)
### DjangoModelForm 的使用指南 #### 什么是 ModelForm? `ModelForm` 是 Django 提供的一个类,用于通过模型自动生成表单。它能够自动创建数据库模型对应的 HTML 表单字段,并提供验证机制以及数据保存的功能[^1]。 --- #### 创建一个简单的 `ModelForm` 假设有一个名为 `Article` 的模型: ```python from django.db import models class Article(models.Model): title = models.CharField(max_length=200) content = models.TextField() published_date = models.DateField() def __str__(self): return self.title ``` 可以通过继承 `forms.ModelForm` 来快速生成一个基于该模型的表单: ```python from django import forms from .models import Article class ArticleForm(forms.ModelForm): class Meta: model = Article fields = '__all__' # 或者指定 ['title', 'content', 'published_date'] ``` 在这里,`fields` 属性指定了要包含在表单中的字段。如果设置为 `'__all__'`,则会包含模型中定义的所有字段。 --- #### 自定义字段和验证逻辑 除了基本的字段映射外,还可以对特定字段进行额外的定制化操作,比如添加验证器或修改默认行为。 ##### 添加验证器 可以在 `clean_<field>` 方法中实现针对某个字段的验证逻辑。例如,在提交文章标题时确保其长度大于等于5字符: ```python def clean_title(self): data = self.cleaned_data['title'] if len(data) < 5: raise forms.ValidationError("Title must be at least 5 characters long.") return data ``` 完整的示例代码如下: ```python from django.core.exceptions import ValidationError class ArticleForm(forms.ModelForm): class Meta: model = Article fields = '__all__' def clean_title(self): data = self.cleaned_data['title'] if len(data) < 5: raise ValidationError("Title must be at least 5 characters long.") return data ``` --- #### 将 ModelForm 集成到视图中 以下是如何在一个视图函数中使用 `ModelForm` 的例子: ```python from django.shortcuts import render, redirect from .forms import ArticleForm def create_article(request): if request.method == 'POST': form = ArticleForm(request.POST) if form.is_valid(): form.save() # 这里会直接将数据存入数据库 return redirect('article_list') else: form = ArticleForm() return render(request, 'create_article.html', {'form': form}) ``` 模板文件 (`create_article.html`) 可能看起来像这样: ```html <form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit">Submit</button> </form> ``` --- #### 处理关联关系 当涉及到 ForeignKey 和 ManyToManyField 关联时,`ModelForm` 同样可以很好地支持这些复杂场景。例如,考虑以下模型结构: ```python from django.db import models class Category(models.Model): name = models.CharField(max_length=100) def __str__(self): return self.name class Post(models.Model): title = models.CharField(max_length=200) category = models.ForeignKey(Category, on_delete=models.CASCADE) tags = models.ManyToManyField(Tag) ``` 相应的 `ModelForm` 定义如下: ```python from .models import Post, Tag, Category class PostForm(forms.ModelForm): class Meta: model = Post fields = ['title', 'category', 'tags'] tags = forms.ModelMultipleChoiceField( queryset=Tag.objects.all(), widget=forms.CheckboxSelectMultiple, ) ``` 在这个例子中,我们还手动替换了 `tags` 字段的小部件以改善用户体验[^3]。 --- #### 嵌套表单的应用案例 有时可能需要多个嵌套表单来完成复杂的业务需求。例如,用户注册时不仅填写基本信息还需要选择国家/地区,则可借助第三方库 `django-countries` 实现更友好的交互体验[^2]。 ```python from django_countries.fields import CountryField from django import forms from django.contrib.auth.models import User class UserProfileForm(forms.ModelForm): country = CountryField().formfield() class Meta: model = User fields = ['username', 'email', 'password', 'country'] ``` --- #### 总结 `ModelForm` 是一种高效的方式,能够在减少开发工作量的同时保持灵活性。无论是简单还是复杂的表单设计,都可以利用它的强大功能轻松应对各种实际应用场景[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天意不可违.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值