更新 post 后,我希望将用户重定向到 post (Django - Python)
After updating the post, I want the user to be redirected to the post (Django - Python)
我希望用户能够更新现有的 post。当用户单击更新,然后单击 Post 时,他们会收到一条错误消息,指出没有要指向的 URL。但是 post 确实在后端得到更新。
我认为行 return reverse('article_detail', kwargs={'slug': self.slug})
会将他们重定向回原来的 post。
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.CASCADE)
url= models.SlugField(max_length=500, blank=True)
#url= models.SlugField(max_length=500, unique=True, blank=True)
def save(self, *args, **kwargs):
self.url= slugify(self.title)
super().save(*args, **kwargs)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('article_detail', kwargs={'slug': self.slug})
这是 table 架构。
sqlite> .schema blog_post
CREATE TABLE IF NOT EXISTS "blog_post" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(100) NOT NULL, "content" text NOT NULL, "url" varchar(500) NOT NULL, "author_id" integer NOT NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED, "date_posted" datetime NOT NULL);
CREATE INDEX "blog_post_url_5af1045a" ON "blog_post" ("url");
CREATE INDEX "blog_post_author_id_dd7a8485" ON "blog_post" ("author_id");
sqlite>
views.py
class PostUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = Post
fields = ['title', 'content']
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
def test_func(self):
post = self.get_object()
if self.request.user == post.author:
return True
return False
urls.py
urlpatterns = [
path('', PostListView.as_view(), name='blog-home'),
path('post/<int:pk>/', views.post_detail, name='post-detail'),
path('post/new/', PostCreateView.as_view(), name='post-create'),
path('post/<int:pk>/update/', PostUpdateView.as_view(), name='post-update'),
path('post/<int:pk>/delete/', PostDeleteView.as_view(), name='post-delete'),
path('about/', views.about, name='blog-about'),
path('facebook/',TemplateView.as_view(template_name='blog/index.html'), name="facebook")
]
更新
我以前有self.url= slugify(self.title)
,现在改成了self.url= slugify(self.id)
。因为要访问我的 post,您输入的是 ID 号而不是职位。不幸的是,问题仍然存在。
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.CASCADE)
url= models.SlugField(max_length=500, blank=True)
#url= models.SlugField(max_length=500, unique=True, blank=True)
def save(self, *args, **kwargs):
self.url= slugify(self.id)
super().save(*args, **kwargs)
更新 2
我现在收到此错误消息。
未找到 'article_detail' 的反向。 'article_detail' 不是有效的视图函数或模式名称。
修复 get_absolute_url
。
def get_absolute_url(self):
return reverse('post-detail', kwargs={'pk': self.pk})
我希望用户能够更新现有的 post。当用户单击更新,然后单击 Post 时,他们会收到一条错误消息,指出没有要指向的 URL。但是 post 确实在后端得到更新。
我认为行 return reverse('article_detail', kwargs={'slug': self.slug})
会将他们重定向回原来的 post。
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.CASCADE)
url= models.SlugField(max_length=500, blank=True)
#url= models.SlugField(max_length=500, unique=True, blank=True)
def save(self, *args, **kwargs):
self.url= slugify(self.title)
super().save(*args, **kwargs)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('article_detail', kwargs={'slug': self.slug})
这是 table 架构。
sqlite> .schema blog_post
CREATE TABLE IF NOT EXISTS "blog_post" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(100) NOT NULL, "content" text NOT NULL, "url" varchar(500) NOT NULL, "author_id" integer NOT NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED, "date_posted" datetime NOT NULL);
CREATE INDEX "blog_post_url_5af1045a" ON "blog_post" ("url");
CREATE INDEX "blog_post_author_id_dd7a8485" ON "blog_post" ("author_id");
sqlite>
views.py
class PostUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = Post
fields = ['title', 'content']
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
def test_func(self):
post = self.get_object()
if self.request.user == post.author:
return True
return False
urls.py
urlpatterns = [
path('', PostListView.as_view(), name='blog-home'),
path('post/<int:pk>/', views.post_detail, name='post-detail'),
path('post/new/', PostCreateView.as_view(), name='post-create'),
path('post/<int:pk>/update/', PostUpdateView.as_view(), name='post-update'),
path('post/<int:pk>/delete/', PostDeleteView.as_view(), name='post-delete'),
path('about/', views.about, name='blog-about'),
path('facebook/',TemplateView.as_view(template_name='blog/index.html'), name="facebook")
]
更新
我以前有self.url= slugify(self.title)
,现在改成了self.url= slugify(self.id)
。因为要访问我的 post,您输入的是 ID 号而不是职位。不幸的是,问题仍然存在。
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.CASCADE)
url= models.SlugField(max_length=500, blank=True)
#url= models.SlugField(max_length=500, unique=True, blank=True)
def save(self, *args, **kwargs):
self.url= slugify(self.id)
super().save(*args, **kwargs)
更新 2
我现在收到此错误消息。
未找到 'article_detail' 的反向。 'article_detail' 不是有效的视图函数或模式名称。
修复 get_absolute_url
。
def get_absolute_url(self):
return reverse('post-detail', kwargs={'pk': self.pk})