首页 > 解决方案 > Django模型不保存

问题描述

我有一个谷歌,看看这里的其他主题。我的表格仍然没有保存。

看法

def newapprentice(request):
    form = NewApprenticeForm()
    if request.method == 'POST':
        #print('Printing POST:', request.POST)
        form = NewApprenticeForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('apprentices/index.html')


    return render(request, 'apprentices/newapprentice.html', {'form': form})

模板

{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block content %}

  <h1>New Apprentice</h1>
  <form action="" method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    <div class="form-row">
      <div class="form-group col-md-6 mb-0">
        {{ form.name|as_crispy_field }}
      </div>
      <div class="form-group col-md-6 mb-0">
        {{ form.email|as_crispy_field }}
      </div>
    </div>
    <div class="form-row">
      <div class="form-group col-md-6 mb-0">
        {{ form.role|as_crispy_field }}
      </div>
      <div class="form-group col-md-6 mb-0">
        {{ form.cost|as_crispy_field }}
      </div>
    </div>
    <div class="form-row">
      <div class="form-group col-md-6 mb-0">
        {{ form.p_name|as_crispy_field }}
      </div>
      <div class="form-group col-md-6 mb-0">
        {{ form.p_time|as_crispy_field }}
      </div>
    </div>
    <div class="form-row">
      <div class="form-group col-md-6 mb-0">
        {{ form.division|as_crispy_field }}
      </div>
      <div class="form-group col-md-6 mb-0">
        {{ form.line_manager|as_crispy_field }}
      </div>
    </div>
    <div class="form-row">
      <div class="form-group col-md-4 mb-0">
        {{ form.on_course|as_crispy_field }}
      </div>
      <div class="form-group col-md-4 mb-0">
        {{ form.finished_course|as_crispy_field }}
      </div>
      <div class="form-group col-md-4 mb-0">
        {{ form.left_course|as_crispy_field }}
      </div>
    </div>
    <div class="form-row">
      <div class="form-group col-md-6 mb-0">
        {{ form.start_date|as_crispy_field }}
      </div>
      <div class="form-group col-md-6 mb-0">
        {{ form.finish_date|as_crispy_field }}
      </div>
    </div>
    <div class="form-row">
      <div class="form-group col-md-12 mb-0">
        {{ form.notes|as_crispy_field }}
      </div>
    </div>
    <button type="submit" class="btn btn-success">Save</button>
    <a href="/apprentices/" class="btn btn-secondary">Back</a>
    </form>
{% endblock %}

表格.py

from django.forms import ModelForm
from .models import Apprentice

class NewApprenticeForm(ModelForm):
    class Meta:
        model = Apprentice
        fields = '__all__'

当我单击保存时,实际上没有任何反应。没有重定向,没有错误。这将打印在控制台中[05/Oct/2020 12:58:13] "POST /apprentices/newapprentice/ HTTP/1.1" 200 12188

如您所见,我打印了request.POST视图中的 ,以查看表单字段中填充的所有数据是否都存在并且都在那里。就在我点击保存的时候。没发生什么事。

有任何想法吗??谢谢

标签: djangodjango-modelsdjango-views

解决方案


表格无效。如果它是有效的,它将保存对象。但即使form.save()不会产生预期的副作用,redirect(…)调用也会产生 302 响应代码,而不是 200 响应代码。

您可以使用以下方法打印表单错误:

def newapprentice(request):
    form = NewApprenticeForm()
    if request.method == 'POST':
        form = NewApprenticeForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('apprentices/index.html')
        print(form.errors)  # ←  print errors in the console

    return render(request, 'apprentices/newapprentice.html', {'form': form})

此外,如果您手动呈现表单,您可能会更好地呈现每个字段的错误和非字段错误。Django 文档对此有一个名为手动渲染字段的部分。因此,您应该重写字段,使它们看起来像:

{{ form.name.errors }}
<div class="form-group col-md-6 mb-0">
    {{ form.name|as_crispy_field }}
</div>

显示该特定字段的错误。这不仅对现在调试视图有用,而且在用户提供无效输入的情况下(例如不是有效电子邮件地址的电子邮件地址)。在这种情况下,Django 可以因此呈现带有错误的表单,以便用户可以解决问题。

编辑:根据错误<ul class="errorlist"><li>dept<ul class="errorlist"><li>This field is required.</li></ul></li><li>date_created<ul class="errorlist"><li>This field is required.</li></ul></li></ul>和模板,您的模板中似乎缺少一个dept字段:

{{ form.dept.errors }}
<div class="form-group col-md-6 mb-0">
    {{ form.dept|as_crispy_field }}
</div>

推荐阅读