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

Django表单无法保存至Admin后台的技术求助

Django表单提交无法保存数据至Admin的修复方案

核心问题分析

提交表单后重定向回表单页面、Admin无新增数据,本质是表单验证失败或数据字段不匹配,以下是各模块的错误点及修复:


1. HTML表单错误修复

错误点:

  • anctype拼写错误,应为enctype="multipart/form-data"
  • 分类下拉框name为categoria,与模型字段category不匹配;且选项值为数字,模型需要ACTION这类枚举键
  • 演员字段name="actors",模型对应pactors/sactors两个字段,表单未区分
  • 缺少模型必填的trailer_url输入框
  • 部分字段重复定义name属性(如image、date)

修复后代码:

<form action="{% url 'add_movies' %}" method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    <div class="textboxes">
        <!-- 电影标题 -->
        <div class="formbox1">
            <div class="text1">
                <label for="input-box">Movie Title:</label>
            </div>
            <div class="box1">
                <input type="text" id="input-box" placeholder="Title here" name="title">
            </div>
        </div>
        <!-- 描述 -->
        <div class="formbox2">
            <div class="text2">
                <label for="description">Description:</label>
            </div>
            <div class="box2">
                <textarea rows="10" cols="30" id="description" name="description"></textarea>
            </div>
        </div>
        <!-- 图片 -->
        <div class="formbox3">
            <div class="text3">
                <p>Image:</p>
            </div>
            <div class="box3">
                <input type="file" name="image" id="image">
            </div>
        </div>
        <!-- 分类 -->
        <div class="formbox4">
            <div class="text4">
                <p>Category:</p>
            </div>
            <div class="box4">
                <select name="category" id="category">
                    <option value="ACTION">ACTION</option>
                    <option value="DRAMA">DRAMA</option>
                    <option value="CRIME">CRIME</option>
                    <option value="HORROR">HORROR</option>
                    <option value="SCI-FI">SCI-FI</option>
                    <option value="MYSTERY">MYSTERY</option>
                    <option value="FAMILY">FAMILY</option>
                    <option value="COMEDY">COMEDY</option>
                    <option value="FANTASY">FANTASY</option>
                </select>
            </div>
        </div>
        <!-- 评分 -->
        <div class="formbox5">
            <div class="text5">
                <p>Classification:</p>
            </div>
            <div class="box5">
                <select name="classification" id="classification">
                    <option value="1/10">1/10</option>
                    <option value="2/10">2/10</option>
                    <option value="3/10">3/10</option>
                    <option value="4/10">4/10</option>
                    <option value="5/10">5/10</option>
                    <option value="6/10">6/10</option>
                    <option value="7/10">7/10</option>
                    <option value="8/10">8/10</option>
                    <option value="9/10">9/10</option>
                    <option value="10/10">10/10</option>
                </select>
            </div>
        </div>
        <!-- 上映日期 -->
        <div class="formbox6">
            <div class="text6">
                <p>Release Date:</p>
            </div>
            <div class="box6">
                <input type="date" name="date" id="date">
            </div>
        </div>
        <!-- 主演 -->
        <div class="formbox7">
            <div class="text7">
                <p>Primary Actors:</p>
            </div>
            <div class="box7">
                <textarea name="pactors" rows="10" cols="30"></textarea>
            </div>
        </div>
        <!-- 配角 -->
        <div class="formbox7">
            <div class="text7">
                <p>Secondary Actors:</p>
            </div>
            <div class="box7">
                <textarea name="sactors" rows="10" cols="30"></textarea>
            </div>
        </div>
        <!-- 制片人 -->
        <div class="formbox8">
            <div class="text8">
                <p>Producer:</p>
            </div>
            <div class="box8">
                <input type="text" id="producer" name="producer">
            </div>
        </div>
        <!-- 预告片链接 -->
        <div class="formbox9">
            <div class="text9">
                <p>Trailer URL:</p>
            </div>
            <div class="box9">
                <input type="url" id="trailer_url" name="trailer_url" placeholder="https://...">
            </div>
        </div>
    </div>  
    <button type="submit" class="add btn">Add</button>     
</form>

2. Views.py错误修复

错误点:

  • add_movies函数存在重复代码、缩进错误,模板文件名拼写错误(addmovies.hmtl→addmovies.html)
  • 未将表单验证错误传递给模板,无法排查问题

修复后代码:

from django.shortcuts import render, redirect
from .models import Movie, Serie
from .forms import MovieForm

def movie(request):
    movies = Movie.objects.all()
    series = Serie.objects.all()
    return render(request, 'filme/base.html', {'movies': movies, 'series': series})

def series_detail(request, id):
    serie = Serie.objects.get(id=id)
    return render(request, 'filme/serie_details.html', {"serie": serie})

def movies_detail(request, id):
    movie = Movie.objects.get(id=id)
    return render(request, 'filme/movie_details.html', {"movie": movie})

def add_movies(request):
    if request.method == "POST":
        form = MovieForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect('movie')
        # 验证失败时返回表单及错误信息
        return render(request, 'filme/addmovies.html', {'form': form}) 
    else:
        form = MovieForm()
    return render(request, 'filme/addmovies.html', {'form': form})

3. Urls.py错误修复

错误点:

  • add_movies的URL包含不必要的<int:Movie_id>参数,添加新电影无需传入ID

修复后代码:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.movie, name="movie"),
    path('movie/', views.movie),
    path('movies_details/<int:id>/', views.movies_detail, name="movie_details"),
    path('serie_details/<int:id>/', views.series_detail, name="series_details"),
    path('addseries/', views.add_series, name="add_series"),  # 同理,添加剧集无需ID
    path('filme/addmovies/', views.add_movies, name='add_movies') 
]

4. Forms.py错误修复

错误点:

  • 手动定义字段时类型错误(TextInput是组件,不是字段,应使用CharField指定widget)
  • Meta字段与模型字段不匹配,缺少pactors

修复后代码(简化版,推荐使用自动生成的字段):

from django import forms
from .models import Movie, Serie
from django.forms import ModelForm
    
class MovieForm(ModelForm):
    class Meta:
        model = Movie
        fields = '__all__'  # 自动生成所有模型字段的表单,避免手动匹配错误

5. Admin.py优化

错误点:

  • 无需强制指定form = MovieForm,默认Admin表单即可正常工作,避免自定义表单干扰

修复后代码:

from django.contrib import admin
from .models import Movie, Serie

class MovieAdmin(admin.ModelAdmin):
    list_display = ['title']

admin.site.register(Movie, MovieAdmin)
admin.site.register(Serie)

6. 额外注意事项

  • 确保已配置媒体文件路径(settings.py中MEDIA_ROOT和MEDIA_URL),否则图片无法上传
  • 运行python manage.py makemigrations和python manage.py migrate确保模型迁移完成
  • 在模板中添加表单错误提示,方便调试:
    {% if form.errors %}
        <div class="errors">
            {% for field in form %}
                {% for error in field.errors %}
                    <p>{{ field.label }}: {{ error }}</p>
                {% endfor %}
            {% endfor %}
        </div>
    {% endif %}
    

内容的提问来源于stack exchange,提问作者marcy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 01:10:54