无法从模板获取正确Django表单,求表单模型选择指导及示例
别担心,我来帮你理清Django里适合你场景的表单定义方式,给你几个实用的示例:
1. 如果你有对应数据库模型:用ModelForm
这是最常用的场景,ModelForm会自动关联你的数据库模型字段,减少重复代码,非常适合需要将表单数据保存到数据库的情况。
第一步:先定义你的模型(示例)
# models.py from django.db import models class Article(models.Model): title = models.CharField(max_length=200) content = models.TextField() pub_date = models.DateTimeField(auto_now_add=True)
第二步:创建对应的ModelForm
# forms.py from django import forms from .models import Article class ArticleForm(forms.ModelForm): # 可以自定义字段的显示样式,比如给标题加占位符和样式类 title = forms.CharField( widget=forms.TextInput(attrs={'placeholder': '输入文章标题', 'class': 'form-control'}) ) class Meta: model = Article # 指定关联的数据库模型 fields = ['title', 'content'] # 指定要包含的字段,也可以用`__all__`包含所有字段 # 若要排除某些自动生成的字段,比如pub_date,用 exclude = ['pub_date']
第三步:在视图中处理表单
# views.py from django.shortcuts import render, redirect from .forms import ArticleForm def create_article(request): if request.method == 'POST': # 将POST提交的数据传入表单实例 form = ArticleForm(request.POST) if form.is_valid(): # 验证表单数据是否合法 form.save() # 直接将验证后的数据保存到数据库 return redirect('article_list') # 提交成功后跳转到文章列表页 else: # GET请求时生成空表单 form = ArticleForm() # 把表单传递给模板渲染 return render(request, 'create_article.html', {'form': form})
第四步:配合你的HTML模板使用
你可以选择让Django自动渲染表单,或者用你自己写的HTML结构(只要字段的name属性和表单类的字段名一致就行):
<!-- 方式1:Django自动渲染(快速开发用) --> <form method="post"> {% csrf_token %} <!-- 必须加,否则会被Django的CSRF保护拦截 --> {{ form.as_p }} <!-- 用段落标签自动包裹每个字段 --> <button type="submit">提交文章</button> </form> <!-- 方式2:自定义你的现有HTML模板 --> <form method="post"> {% csrf_token %} <div class="form-group"> <label for="id_title">文章标题:</label> <input type="text" id="id_title" name="title" placeholder="输入文章标题" class="form-control" required> </div> <div class="form-group"> <label for="id_content">文章内容:</label> <textarea id="id_content" name="content" rows="6" class="form-control" required></textarea> </div> <button type="submit" class="btn btn-primary">提交文章</button> </form>
2. 如果没有对应数据库模型:用普通Form
比如搜索表单、联系表单这类不需要保存数据到数据库的场景,直接用普通Form定义即可。
定义普通表单
# forms.py from django import forms class SearchForm(forms.Form): keyword = forms.CharField( max_length=100, widget=forms.TextInput(attrs={'placeholder': '输入关键词搜索', 'class': 'form-control'}) ) # 可选的分类选择框 category = forms.ChoiceField( choices=[('all', '全部'), ('article', '文章'), ('news', '新闻')], required=False, widget=forms.Select(attrs={'class': 'form-control'}) )
视图中处理这个表单
# views.py from django.shortcuts import render from .forms import SearchForm def search(request): # GET请求用request.GET传递表单数据 form = SearchForm(request.GET) results = [] if form.is_valid(): # 用form.cleaned_data获取经过验证的安全数据 keyword = form.cleaned_data['keyword'] category = form.cleaned_data.get('category', 'all') # 这里写你的搜索逻辑,比如筛选数据库数据 # results = Article.objects.filter(title__icontains=keyword) return render(request, 'search.html', {'form': form, 'results': results})
模板示例
<form method="get"> <div class="input-group"> {{ form.keyword }} {{ form.category }} <button type="submit" class="btn btn-primary">搜索</button> </div> </form>
几个关键注意点
- 所有POST表单必须加上
{% csrf_token %},否则Django的CSRF保护机制会拒绝请求 - 视图中一定要区分GET和POST请求:GET请求用于展示空表单,POST请求用于处理提交的数据
- 表单验证通过后,一定要用
form.cleaned_data获取数据,不要直接用request.POST里的原始数据,因为cleaned_data是经过清洗和验证的安全数据
内容的提问来源于stack exchange,提问作者olexii.lavrov
相关产品推荐
相关产品推荐

