Django создать пост
Я пытаюсь создать новое сообщение на форуме, и это работает, я также печатаю, если форма действительна, но когда я иду проверять после того, как сообщение не опубликовано. На странице администратора сообщение есть, оно одобрено, но отсутствуют поля тегов и категории. Они были добавлены при создании поста, если нет, то я получаю ошибку. Но мне приходится вручную добавлять их на странице администратора, чтобы сообщение было размещено на форуме.
Вот мой пост в моделях
class Post(models.Model):
title = models.CharField(max_length=400)
slug = models.SlugField(max_length=400, unique=True, blank=True)
user = models.ForeignKey(Author, on_delete=models.CASCADE)
content = HTMLField()
categories = models.ManyToManyField(Category)
date = models.DateTimeField(auto_now_add=True)
approved = models.BooleanField(default=True)
tags = TaggableManager()
comments = models.ManyToManyField(Comment, blank=True)
# closed = models.BooleanField(default=False)
# state = models.CharField(max_length=40, default="zero")
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.title)
super(Post, self).save(*args, **kwargs)
def __str__(self):
return self.title
Вот мой views.py
@login_required
def create_post(request):
context = {}
form = PostForm(request.POST or None)
if request.method == "POST":
if form.is_valid():
print("\n\n form is valid")
author = Author.objects.get(user=request.user)
new_post = form.save(commit=False)
new_post.user = author
new_post.save()
return redirect('forums')
context.update({
'form': form,
'title': 'Create New Post'
})
return render(request, 'forums/create_post.html', context)
html очень простой, для проверки.
<form method="POST">
{% csrf_token %}
{{form|crispy}}
<!-- Submit Post -->
<input type="submit" value="Save">
</form>
Пожалуйста, любая помощь будет очень признательна
Строка new_post = form.save(commit=False)
не сохраняет отношения "многие ко многим" согласно docs. Обходной путь
new_post = form.save(commit=False)
new_post.user = author
new_post.save()
form.save_m2m()
Выдержка из docs
Другой побочный эффект использования commit=False проявляется, когда ваша модель имеет отношение отношение "многие-ко-многим" с другой моделью. Если ваша модель имеет многие-ко-многим и вы указываете commit=False при сохранении форму, Django не может немедленно сохранить данные формы для отношения "многие-ко-многим". Это происходит потому, что невозможно сохранить данные отношения "многие-ко-многим" для экземпляра, пока этот экземпляр не существует в базе данных.
Чтобы обойти эту проблему, каждый раз, когда вы сохраняете форму с использованием commit=False, Django добавляет метод save_m2m() в ваш ModelForm подкласса ModelForm. После того, как вы вручную сохранили экземпляр, созданный формы, вы можете вызвать save_m2m(), чтобы сохранить данные формы "многие ко многим".
.
Не думаю, что это решит все проблемы, но попробуйте.
попробуйте этот код :
obj = form.save(commit=False)
obj.user = request.user
obj.save()