I have a Django form that creates blog posts, however the form throws Exceptions when submitting. Strangely, however they still create these posts and I can view these on the other page. Here are my models.py, views.py, form.py code and the stack trace.
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)
Didn't want to clog up the post with a sea of text, so for readability purposes I used Djangos stack trace sharing feature: Stack trace
I don't understand where the character 'r' is coming from, because it still updates the database, could someone also provide an explanation as to why this is occuring? Also, I also tried following: ValueError: Field 'id' expected a number but got 'Processing'