Django ModelForm не сохраняет данные в базу данных, не работает Form.save? - PullRequest
0 голосов
/ 24 июня 2018
  • Элемент списка

Здравствуйте, я новичок в Джанго, мне трудно, может кто-нибудь помочь мне, я не знаю, что я делаю не так? Я пытаюсь создать форму и сохранить некоторые данные через нее с помощью 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 settings

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

Ответы [ 3 ]

0 голосов
/ 25 июня 2018

Ваш отступ неправильный, остальное должно быть для первого '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})
0 голосов
/ 25 июня 2018

Вы забыли 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>

Надеюсь, это поможет. Добро пожаловать на борт;)

0 голосов
/ 25 июня 2018

Я вижу некоторые проблемы с отступами в представлении - но я предполагаю, что это просто форматирование при копировании в Stackoverflow.

проверка form.is_valid() проверит все ваши поля формы и выполнит запись только в базу данных.если все поля ввода верны.Если это не сохранение, первое место, которое я бы проверял, было бы на наличие ошибок формы.

В вашем шаблоне вы можете отобразить ошибки с помощью {{form.errors}}, и в нем будут перечислены все поля и ошибки.

...