Перенаправление на публикацию деталей от создания new_post не работает

У меня есть раздел под названием форум в моем проекте, где пользователи могут публиковать и обсуждать.

При создании нового сообщения, когда я пытаюсь сохранить свое новое сообщение как пользователя (рис.), Возникает эта ошибка. Я пытаюсь сохранить имя пользователя, чтобы показать, какой пользователь создает сообщение.

На самом деле проблема показывает, когда я пытаюсь сохранить этот файл.

Я пытался следующим образом:

models.py:

class Post(models.Model):
    user_id =  models.ForeignKey(User, on_delete =models.CASCADE)
    title = models.CharField(max_length = 500, blank = False)
    description = models.TextField()

    def __str__(self):
        return self.title

views.py:

class PostCreate(CreateView):
    model = Post
    fields=['title','description']
    template_name = 'post_form.html'

    def self(self, request):
        model.user_id =  request.user.id
        return redirect('website:details',{'post': model})

urls.py

from django.conf.urls import url

from .views import UserFormView  , index , user_login,Forum,Details,PostCreate

app_name = 'website'

urlpatterns = [
    url(r'^$',index,name = 'index'),
    url(r'^register/$',UserFormView.as_view(),name = 'register'),
    url(r'^login/$', user_login, name= 'login'),
    url(r'^forum/$',Forum, name = 'Forum'), 
    url(r'details/(?P<post_id>[0-9]+)/$',Details,name= 'details'),
    url(r'add/$',PostCreate.as_view(),name = 'newPost')
]

2 ответа

Попробуйте использовать в своем методе form_valid вместо перенаправления.

 return HttpResponseRedirect(reverse('website:details', kwargs={'post_id': post.id,}))

Вы пытаетесь настроить пользователя в def self, но этот код принадлежит form_valid метод.

class PostCreate(CreateView):

    model = Post
    fields=['title','description']
    template_name = 'post_form.html'

    def form_valid(self, form):
        post = form.save(commit=False)
        post.user_id = self.request.user # see note below
        post.save()       
        return redirect('website:details', post=post)

Кроме того, было бы неплохо переименовать ваш внешний ключ user_id в user, В данный момент, post.user_id является связанным пользователем, и post.user_id_id это идентификатор пользователя. Было бы лучше, если бы вы изменили свою модель на:

class Post(models.Model):
    user =  models.ForeignKey(User, on_delete =models.CASCADE)

затем post.user будет пользователем, и post.user_id будет идентификатором пользователя. Если вы сделаете это изменение, вам придется запустить makemigrations а также migrate изменить имя поля.

Другие вопросы по тегам