После обновления сообщения я хочу, чтобы пользователь был перенаправлен на сообщение (Django - Python) - PullRequest
0 голосов
/ 27 апреля 2020

Я хочу, чтобы пользователь мог обновлять существующие сообщения. Когда пользователь нажимает кнопку «Обновить», а затем «Опубликовать», он получает сообщение об ошибке, в котором говорится, что URL-адрес отсутствует. Но пост действительно обновляется на бэкэнде.

enter image description here

enter image description here

enter image description here

Я думал, что строка return reverse('article_detail', kwargs={'slug': self.slug}) перенаправит их обратно в исходное сообщение.

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})

Вот схема таблицы.

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). Потому что для доступа к моим сообщениям вы вводите идентификационный номер, а не заголовок. К сожалению, проблема сохранилась.

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)

enter image description here

Обновление 2

Теперь я получаю это сообщение об ошибке.

Реверс для article_detail не найден. 'article_detail' не является допустимой функцией представления или именем шаблона.

enter image description here

1 Ответ

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

Fix get_absolute_url.

def get_absolute_url(self):
    return reverse('post-detail', kwargs={'pk': self.pk})
...