Запись в бд не обновляется а дублируется на джанго
Пишу сайт на джанго, хочу сделать функцию редактирования новостных статей в базе данных, но вместо обновления сайт добавляет измененную запись как новую, а старую не удаляет. Добавление статьи и динамический просмотр работают. Код в models:
from django.db import models
class Article(models.Model):
header=models.CharField('Название', max_length=50)
text=models.TextField('Текст', max_length=10000)
dateTime=models.DateTimeField('Время и дата')
def __str__(self):
return self.header
class Meta:
verbose_name='Новость'
verbose_name_plural='Новости'
def get_absolute_url(self):
return f'/{self.id}'
код в views:
from django.shortcuts import render, redirect
from .models import Article
from .forms import ArticleForm
from django.views.generic import DetailView, UpdateView
# Create your views here.
class NewsDetail(DetailView):
model=Article
template_name='newslist/detail.html'
context_object_name = 'Article'
class NewsUptade(UpdateView):
model=Article
template_name = 'newslist/add.html'
form_class = ArticleForm
def index(request):
news=Article.objects.order_by('dateTime')
return render(request, 'newslist/index.html', {'news':news})
def add(request):
error=''
if request.method=='POST':
form=ArticleForm(request.POST)
if form.is_valid():
form.save()
return redirect('main_page')
else:
error='Некорректные данные!'
form=ArticleForm()
data={'form':form, 'error':error}
return render(request, 'newslist/add.html', data)
код в forms:
from .models import Article
from django.forms import ModelForm, TextInput, Textarea, DateTimeInput
class ArticleForm(ModelForm):
class Meta:
model=Article
fields=['header', 'text', 'dateTime']
widgets={
'header':TextInput(attrs={
'class':'inputform inputname',
'placeholder':'Название'
}),
'text':Textarea(attrs={
'class':'inputform',
'placeholder':'Текст'
}),
'dateTime': DateTimeInput(attrs={
'class': 'inputform inputdate',
'placeholder': 'Дата и время'
})
}
код в urls (в приложении):
from django.contrib import admin
from django.urls import path, include
from . import views
urlpatterns = [
path('', views.index, name='main_page'),
path('/add', views.add, name='add'),
path('<int:pk>', views.NewsDetail.as_view(), name='news-detail'),
path('<int:pk>/uptade', views.NewsUptade.as_view(), name='news-uptade')
]
код в index.html:
{% extends 'newslist/layout.html' %}
{% block title %}
Новости
{% endblock %}
{% block body %}
<div class="container">
{% for el in news %}
<div class="new">
<h4 class="name">{{ el.header }}</h4><br>
<p class="text">{{ el.text }}</p>
<p class="dateTime">{{ el.dateTime }}</p>
<a class="view-btn" href="{% url 'news-detail' el.id %}">Смотреть</a>
</div>
{% endfor %}
<a class="add" href="{% url 'add' %}">Добавить</a>
</div>
{% endblock %}
код в add.html:
{% extends 'newslist/layout.html' %}
{% block title %}
Добавить новость
{% endblock %}
{% block body %}
<div class="container">
<form method="post" class="form" action="{% url 'add' %}">
{% csrf_token %}
{{ form.header }}<br>
{{ form.text }}<br>
{{ form.dateTime }}<br>
<span>{{ error }}</span>
<button type="submit" class="add addnew">Сохранить запись</button>
</form>
</div>
{% endblock %}
код в шаблоне layout.html:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>{% block title %}{% endblock %}</title>
<style>
body{
background-color: rgb(136, 155, 168);
}
.container{
background-color: rgb(209, 208, 255);
margin-top: 20px;
width: 70%;
margin-left: auto;
margin-right: auto;
border-radius: 50px;
padding-top: 40px;
padding-bottom: 40px;
}
.new{
border: 1px solid rgb(124, 124, 124);
border-radius: 20px;
margin-top: 40px;
margin-bottom: 40px;
width: 80%;
margin-left: auto;
margin-right: auto;
}
.name{
font-size: 30px;
text-align: center;
}
*{
font-family:Arial;
text-decoration: none;
}
.text{
text-align: center;
}
.dateTime{
margin-left: 20px;
}
.add{
background-color: rgb(0, 0, 255);
color: white;
border-radius: 10px;
padding: 20px;
margin-left: 100px;
transition: all 0.2s;
border: 2px solid blue;
}
.add:hover{
background-color: rgb(209, 208, 255);
color:blue;
}
.form{
width: 70%;
margin-left: auto;
margin-right: auto;
text-align: center;
}
.inputform{
border-radius: 20px;
border: 2px solid blue;
background-color: rgb(222, 222, 255);
margin: 20px;
}
.addnew{
margin: auto;
}
.inputname{
width: 300px;
height: 30px;
}
.inputdate{
width: 300px;
height: 30px;
}
.view-btn{
padding: 10px;
border-radius: 5px;
background-color: rgb(70, 70, 70);
color: white;
transition: all 0.2s;
border: 2px solid rgb(70, 70, 70);
margin-left: 20px;
}
.view-btn:hover{
background-color: rgb(222, 222, 255);
color: rgb(0, 0, 0);
border: 2px solid rgb(70, 70, 70);
}
</style>
<script>
</script>
</head>
<body>
{% block body %}
{% endblock %}
</body>
</html>