I want to build CreateView for books. But in this CreateView I have “if elif else” functions. And also I have Many-to-many for co-author.
When I use this approach (a code below) it works, but when the book is created, it has status for obj.coauthor. But I did not use a co-author for this book. Also If I created the book with publisher it also have status as if I used a co-author.
views.py
class BookCreateView(LoginRequiredMixin, CreateView):
model = Book
form_class = BookForm
template_name = "books/book_create.html"
def form_valid(self, form):
form.instance.author = self.request.user
return super(BookCreateView, self).form_valid(form)
def post(self, request, * args, **kwargs):
form = self.get_form()
if form.is_valid():
obj = form.save(commit=False)
obj.author = self.request.user
obj.save()
form.save_m2m()
if obj.publisher and obj.coauthor:
obj.state = obj.BookProcess.Draft
obj.save()
form.save_m2m()
return redirect("book_detail", obj.slug)
elif obj.coauthor:
obj.state = obj.BookProcess.Draft
obj.save()
form.save_m2m()
return redirect("book_detail", obj.slug)
elif obj.publisher:
obj.state = obj.BookProcess.Co_author_approved
obj.save()
form.save_m2m()
return redirect("book_detail", obj.slug)
else:
obj.state = obj.BookProcess.Published
obj.save()
form.save_m2m()
return redirect("book_detail", obj.slug)
But when I use this code without, obj.save() form.save_m2m()
firstly I have an error <Book: example>" needs to have a value for field “id” before this many-to-many relationship can be used (the code below).
views.py (without)
class BookCreateView(LoginRequiredMixin, CreateView):
model = Book
form_class = BookForm
template_name = "books/book_create.html"
def form_valid(self, form):
form.instance.author = self.request.user
return super(BookCreateView, self).form_valid(form)
def post(self, request, * args, **kwargs):
form = self.get_form()
if form.is_valid():
obj = form.save(commit=False)
obj.author = self.request.user
# I removed these two lines
if obj.publisher and obj.coauthor:
obj.state = obj.BookProcess.Draft
obj.save()
form.save_m2m()
return redirect("book_detail", obj.slug)
elif obj.coauthor:
obj.state = obj.BookProcess.Draft
obj.save()
form.save_m2m()
return redirect("book_detail", obj.slug)
elif obj.publisher:
obj.state = obj.BookProcess.Co_author_approved
obj.save()
form.save_m2m()
return redirect("book_detail", obj.slug)
else:
obj.state = obj.BookProcess.Published
obj.save()
form.save_m2m()
return redirect("book_detail", obj.slug)
models.py
class Book(models.Model):
slug = models.SlugField(unique=True)
title = models.CharField(max_length=255, db_index=True)
author = models.ForeignKey(
"users.CustomUser", on_delete=models.SET_NULL, null=True
)
coauthor = models.ManyToManyField(
"users.CustomUser",
blank=True,
related_name="coauthor",
abstract = models.TextField(blank=True, null=True)
content = models.TextField(blank=True, null=True)
publisher = models.ForeignKey(
"Publisher", on_delete=models.SET_NULL, null=True, blank=True
)