Django ModelForm没有将数据保存到数据库,Form.save无法正常工作?

时间:2018-06-24 20:57:43

标签: python django django-models django-forms

  • 列表项

你好,我是django初学者,遇到了困难时期,有人可以帮我吗,我不知道我做错了什么吗? 我正在尝试创建一个表单,并使用form.save()通过它保存一些数据。而且我也是新来的,所以不要介意任何错误。

这是我的模特:

from django.db import models
from stores.models import Store


class Category(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=30)

    def __str__(self):
        return self.name


class Product(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=30)
    price = models.DecimalField(max_digits=5, decimal_places=5)
    image = models.ImageField(upload_to='upload_to/')
    category = models.ForeignKey(Category, default='Default', on_delete=models.CASCADE, blank=False, null=False)
    store = models.ForeignKey(Store, on_delete=models.CASCADE, blank=False, null=False)

这是我的观点:

from django.shortcuts import render, redirect
from .forms import NewPro


def pro(request):

    if request.method == 'POST':
        form = NewPro(request.POST)
        if form.is_valid():
            form.save()
            return redirect('stores_list')

    else:
        form = NewPro()

    return render(request, "default/add_product.html", {'form': form})


def product_list(request):
    return render(request, 'default/product_list.html')

这是我的表格:

from django import forms
from .models import Product


class NewPro(forms.ModelForm):
    class Meta:
        model = Product
        fields = ('name', 'price', 'image','category', 'store',)

default / add_product.html:

{% extends 'default/base.html' %}
<html>
<head><title>E-Commerce App</title></head>
{% block content %}
    <h1>Add Product details</h1>
    <form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Add Product</button>
    </form>{% endblock %}
 </html>

Settings.py设置

MEDIA_ROOT = '/home/saifi/Saif_project/final_project/MEDIA_ROOT/upload_to'

3 个答案:

答案 0 :(得分:2)

我可以在视图中看到一些缩进问题-但我想这只是在复制到Stackoverflow中时的格式。

form.is_valid()检查将验证您所有的表单字段,并且仅在所有输入字段均有效时才写入数据库。如果没有保存,我首先要检查的是表格错误。

在模板中,您可以使用{{form.errors}}来显示错误,并且它将列出每个字段和错误。

答案 1 :(得分:1)

您的缩进是错误的,否则应为第一个'if'

def pro(request):
  form = NewPro()
  if request.method == 'POST':
    form = NewPro(request.POST)
    if form.is_valid():
      form.save()
      return redirect('stores_list')

  else:
    form = NewPro()
  return render(request, "default/add_product.html", {'form': form})

答案 2 :(得分:1)

您在request.FILES视图功能中忘记了pro,毕竟您有一个图像文件。

def pro(request):

    if request.method == 'POST':
        form = NewPro(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect('stores_list')

    else:
        form = NewPro()

    return render(request, "default/add_product.html", {'form': form})

尝试以这种方式使用表单:

<form action="YOUR_URL_HERE" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Add Product</button>
</form>

我希望这会有所帮助。欢迎登机;)