RelatedObjectDoesNotExist в / post / new / - у автора нет автора - PullRequest
1 голос
/ 30 апреля 2020

Я реализовал allauth для регистрации пользователя, и теперь я пытаюсь связать current_user с сообщением при его создании. Когда я нажимаю «Отправить», я получаю «У автора нет сообщения», очевидно, что сообщения не распознают пользователя.

Модель:

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
class Post(models.Model):
  title = models.CharField(max_length=100)
  content = models.TextField()
  date_posted = models.DateTimeField(default=timezone.now)
  author = models.ForeignKey(User, on_delete=models.DO_NOTHING)

  def __str__(self):
    return self.title

Вид:

def create_post(request, pk=None):


form = PostForm(request.POST)

  if form.is_valid():
    post = form.save(commit=False)
    post.author(request.user)
    post.save()
  else:
    form = PostForm()

  context = {'form' : form}
  return render(request, 'blog/create_post.html', context)

Я действительно мог бы использовать некоторые указатели, большое спасибо.

1 Ответ

1 голос
/ 30 апреля 2020

Вы можете установить author экземпляр .instance, заключенный в форму:

from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect

@login_required
def create_post(request, pk=None):
    if request.method == 'POST':
        form = PostForm(request.POST)
        if form.is_valid():
            <b>form.instance.author = request.user</b>
            form.save()
            return redirect(<i>'name-of-a-view'</i>)
    else:
        form = PostForm()
    context = {'form' : form}
    return render(request, 'blog/create_post.html', context)

Примечание : вы можете ограничить просмотры для аутентифицированных представлений пользователи с @login_required декоратором [Django -doc] .

Примечание : В случае успешного запроса POST вы должны сделать redirect [Django -doc] для реализации Post / Redirect / Получить шаблон [вики] . Это позволяет избежать того же запроса POST, когда пользователь обновляет браузер.

...