You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法从模板获取正确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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:20:16