У меня есть форма Django, которая создает сообщения в блоге, однако форма выдает исключения при отправке. Как ни странно, но они все еще создают эти сообщения, и я могу просмотреть их на другой странице. Вот мой код models.py, views.py, form.py и трассировка стека.
Models.py
from django.db import models
from django.utils import timezone
from django.contrib.auth import get_user_model
User = get_user_model()
class Author(models.Model):
""" Inherits the auth user model """
user = models.OneToOneField(User, on_delete=models.CASCADE)
def __str__(self):
return self.user.username
class Category(models.Model):
""" Generic entries so posts can be filtered """
title = models.CharField(max_length=20)
def __str__(self):
return self.title
class News_Post(models.Model):
""" Inherits Category & Author Models """
title = models.CharField(max_length=100)
content = models.TextField()
date_posted = models.DateTimeField(default=timezone.now)
date_modified = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
categories = models.ManyToManyField(Category)
featured = models.BooleanField()
post_img = models.ImageField(default='default.jpg')
def __str__(self):
return self.title
Forms.py:
from .models import News_Post
from django import forms
class News_Post_Form(forms.ModelForm):
""" Form responsible for creating new posts. """
id = None
content = forms.CharField()
categories = forms.CharField()
featured = forms.BooleanField()
post_img = forms.ImageField()
class Meta:
model = News_Post
fields = [
'title',
'content',
'categories',
'featured',
'post_img',
]
Views.py
from django.shortcuts import render, redirect
from .models import News_Post, Author
from .forms import News_Post_Form
from django.contrib.auth.decorators import login_required
from django.views.generic import CreateView
def get_author(user):
"""Gets the author"""
ath= Author.objects.filter(user=user)
if ath.exists():
return ath[0]
return None
class PostCreateView(CreateView):
"""Generic post view """
model = News_Post
template_name = 'create_post.html'
form_class = News_Post_Form
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['title'] = 'Create'
return context
def form_valid(self, form):
form.instance.author = get_author(self.request.user)
form.save()
@login_required
def news_post_create(request):
""" Creates new posts """
title = 'Create a new post.'
author = get_author(request.user)
form = News_Post_Form(request.POST or None, request.FILES or None)
if request.method == 'POST':
if form.is_valid():
form.instance.author = author
form.clean()
form.save()
return redirect('blog/posts.html')
context = {
'title': title,
'form': form,
}
return render(request, 'blog/create_post.html', context)
@login_required
def news_post(request):
""" Renders the 'News_Post' model. """
query = News_Post.objects.filter(featured=True)
context = {
'obj_list': query
}
return render(request, 'blog/posts.html', context)
Не хотел засорять сообщение морем текста, поэтому для удобства чтения я использовал функцию совместного использования трассировки стека Djangos: Трассировка стека
Я не понимаю, откуда взялся символ 'r', потому что он все еще обновляет базу данных, может ли кто-нибудь также объяснить, почему это происходит? Кроме того, я также пробовал следующее: ValueError: Поле 'id' ожидало число, но получило 'Обработка'