Почему данные из формы не сохраняются в бд
я вывожу список форм и хочу что б после заполнения данные из них сохранялись в бд
views
from django.shortcuts import render
from .forms import TaskForm
from .models import Task
# Create your views here.
forms = [];
def save_list(request):
for form in forms:
if form.is_valid():
f = Task.objects.create(title=form.title)
f.save()
f.publish()
return render(request, 'main/save.html', {'forms': Task.objects.all()}) # ищет в templates по дефолту
def task_add(request):
if request.method == 'POST':
form = TaskForm(request.POST)
if form.is_valid():
form.cleaned_data()
form.save()
else:
forms.append(TaskForm());
return render(request, 'main/task_add.html', {'forms': forms})
forms
from django import forms
from .models import Task
class TaskForm(forms.Form):
class Meta:
model = Task
fields = ['title']
#title = forms.CharField(max_length=50);
def save(self):
new_task = Task.objects.create(self.title)
return new_task;
models
from django.db import models
from django.conf import settings
class Task(models.Model):
title = models.CharField(max_length=30)
def publish(self):
self.save()
def __str__(self):
return self.title
HTML
{% extends 'main/base.html' %}
{% block content %}
{% for form in forms %}
<form class="form"method="POST" class="post-form" >
{{form}}
<input type="button" value="ok" class="but" >
<input type="button" value="add" onClick='location.href="http://127.0.0.1:8000/add"' class="add">
</form>
{% endfor %}
{% endblock %}
Ответы (1 шт):
У тебя код абсолютно не правильно написан
forms.pyты переопределяешь методsaveу формы - зачем(к тому же ты не правильно используешь аттрибуты формы. У формы не будетself.title, тебе нужно использовать былоself.cleaned_data['title'])? Замениforms.Formнаforms.ModelFormпосле этого форма сама автоматически сможет себя сохранять- во views.py ты странно используешь глобальную переменную. Ты почему-то решил, что она будет постоянно пополнятся формами при том, как ты вызовешь метод добавить, что абсолютно не так.
- метод
save_listТы пробегаешь по всем формам и пытаешься сохранить их, но ты не передаешь им данные которые ввел пользователь(да банально у тебя не будет там форм в этом списке). При сохранении ты должен опираться только наrequest.POSTи смотреть по нему сколько форм ввел пользователь. Дальше само сохранение ты используешь иf.save()иf.publish()у тебя методpublishидентичен методуsave, зачем сохранять дважды?
затем ты рендеришь страницу и в нее передаешь списком форм - список объектов Task, ты уж определись, что ты хочешь отдать в шаблон - формы или данные модели и называй переменные соответствующе, а то потом сам не будешь понимать что и где у тебя происходит.
п.с. 4 пункт не верен, я ошибся
4. Дальше, то как ты пишешь формы в шаблоне
Ты выводишь подряд несколько форм (внутри одного тега <form>...</form>)
у тебя формы имеют одинаковое название полей и при сохранении ты банально будешь терять часть данных, что бы этого не происходило формируй список форм не просто как массив из форм, а с помощью formset https://docs.djangoproject.com/en/3.1/topics/forms/modelforms/#django.forms.models.BaseModelFormSet
Edit: пример динамического добавления формы на страницу
<html lang="en">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<style type="text/css">.hidden{ display: none;}</style>
</head>
<body>
<div class="hidden form-block">
<hr/>
<form class="form" method="POST" class="post-form" >
{{form}}
<input type="button" value="ok" class="but" >
</form>
</div>
<input id="btn_new" type="button" value="add" class="add">
<script language="Javascript">
$( document ).ready(function() {
$('#btn_new').bind('click', function(event) {
let new_block = $('.form-block').clone();
new_block.removeClass('hidden form-block');
$('#btn_new').after(new_block);
event.preventDefault();
});
});
</script>
</body>
</html>
по уму стили вынести отдельно, Javscript отдельно, да и можно было бы обойтись чистым Javascript без jQuery.