Что делать, если данные не сохраняются в Django?

Я новичок в Django. И столкнулся с проблемой сохранения данных из формы в базу данных. Я писал код на PyCharm. Основная проблема в том, что данные не сохраняются в базу данных. Нет ни ошибок, ни предупреждений, НИЧЕГО. Все работает, кроме сохранения. Буду очень благодарен за помощь! Вот код:
views.py:

from django.shortcuts import render, redirect
from .models import Articles
from .forms import ArticlesForm


def news_home(request):
    news = Articles.objects.order_by('title')
    return render(request, 'news/news_home.html', {'news': news})


def create(request):
    error = ''
    if request.method == 'POST':
        form = ArticlesForm(request.POST)
        if form.is_valid():
            article = form.save()
            return redirect('news_home')
        else:
            error = 'Unfortunately, the form was not filled out correctly.'

    form = ArticlesForm()

    data = {
        'form': form,
        'error': error
    }
    return render(request, 'news/create.html', data)

models.py:

from django.db import models


class Articles(models.Model):
    title = models.CharField('name', max_length=50)
    anons = models.CharField('anons', max_length=250)
    full_text = models.TextField('article')
    date = models.DateTimeField('Date of publication')

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = 'news'
        verbose_name_plural = 'news'

forms.py:

from .models import Articles
from django.forms import ModelForm, TextInput, DateTimeInput, Textarea


class ArticlesForm(ModelForm):
    class Meta:
        model = Articles
        fields = ['title', 'anons', 'full_text', 'date']

        widgets = {
            "title": TextInput(attrs={
                'class': 'form-control',
                'placeholder': 'the name of the record'
            }),
            "anons": TextInput(attrs={
                'class': 'form-control',
                'placeholder': 'Announcement of the recording'
            }),
            "full_text": Textarea(attrs={
                'class': 'form-control',
                'placeholder': 'write about something'
            }),
            "date": DateTimeInput(attrs={
                'class': 'form-control',
                'placeholder': 'Date of publication'
            }),
        }

urls.py:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.news_home, name='news'),
    path('сreate', views.create, name='create'),
]

Я перепробовал кучу видео на YouTube и статей из интернета, но все тщетно. UPD: Я также посмотрел документацию.

мы все там были. Проблема заключается в функции представления def create() в вашем файле views.py. строка article = form.save() в данном случае не нужна. Однако вы можете использовать ее, если хотите. Вот 2 различных варианта реализации.

Упрощенный метод

def create(request):
if request.method == 'POST':
    form = ArticlesForm(request.POST)
    if form.is_valid():
        article = form.save(commit==False)  # Save the article

        return redirect('news_home')  # Redirect after POST
    else:
        error = 'Unfortunately, the form was not filled out correctly.'
else:
    form = ArticlesForm()  # Initialize a blank form for GET requests
    error = ''  # No error initially on GET request

context = {
    'form': form,
    'error': error
}
return render(request, 'news/create.html', context)

Ваш метод

def create(request):
if request.method == 'POST':
    form = ArticlesForm(request.POST)
    if form.is_valid():
        article = form.save(commit==False)  # here we assign form to article
        # perform some task here like setting author to user: article.author = request.user
        article.save()
        return redirect('news_home')  # Redirect after POST
    else:
        error = 'Unfortunately, the form was not filled out correctly.'
else:
    form = ArticlesForm()  # Initialize a blank form for GET requests
    error = ''  # No error initially on GET request

context = {
    'form': form,
    'error': error
}
return render(request, 'news/create.html', context)

Оба метода будут работать, но я бы посоветовал придерживаться более простого. Счастливого кодирования.

Вернуться на верх