Как перенаправить на последнюю страницу посещения DJANGO PYTHON

#django #django-models #django-forms #django-views #django-templates

#django #django-модели #django-forms #django-просмотры #django-шаблоны

Вопрос:

добрый вечер! Надеюсь, все отлично!

Ну, у меня небольшая проблема с перенаправлением в Django, я пытался создать раздел комментариев для своего веб-приложения, но после «публикации» комментария я могу перенаправить пользователя только на свою домашнюю страницу (через return redirect ('/')

Models.py:

 class Task(models.Model):
    title = models.CharField(max_length=50)
    content = models.TextField(blank=True)
    date_created = models.DateTimeField(auto_now_add=True)
    due_date = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User,  null=True, on_delete=models.SET_NULL, default=User)
    responsable = models.ForeignKey(User, null=True, on_delete=models.SET_NULL, related_name="author", default=author)
    STATUS_CHOICES = [('D', 'Done'),('P','Doing'),('N','Not done')]
    Status = models.CharField(max_length=1,choices=STATUS_CHOICES, default='N')
    IMPORTANCE_CHOICES = [('H', 'High'),('M','Medium'),('L','Low')]
    importance = models.CharField(max_length=1,choices=IMPORTANCE_CHOICES, default='M')
    DEPARTAMENT_CHOICES = [('D', 'Dev'),('M','Marketing'),('H','HR'),('L','Legal'),('F','Finances'),('O','Others')]
    departament = models.CharField(max_length=1,choices=DEPARTAMENT_CHOICES, default='M')
    is_public = models.BooleanField(default=False)

    def  __str__(self):
        return self.title

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

class Comment(models.Model):
    task = models.ForeignKey(Task, on_delete=models.CASCADE, related_name='comments')
    author = models.ForeignKey(User,  null=True, on_delete=models.SET_NULL, default=User)
    body = models.TextField(help_text='Add a comment')
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    active = models.BooleanField(default=True)

    class Meta:
      ordering = ('-created',)

    def __str__(self):
      return '%s - %s' % (self.task.title, self.author)
  

Views.py:

 class CommentCreate(CreateView):
    model = Comment
    fields = ['body']

    def form_valid(self, form):
        form.instance.task_id = self.kwargs['pk']
        form.instance.author = self.request.user
        form.instance.created = timezone.now()
        form.save()
        return redirect('/')
  

urls.py

 from django.urls import path, include
from . import views
from .views import (DashboardTaskAppView, 
                    TaskDetailView,
                    TaskCreateView, 
                    TaskUpdateView, 
                    DashboardTaskAppViewPublic,
                    TaskDeleteView,
                    CommentCreate)

urlpatterns = [
    path('', views.index_app, name="home-app"),
    path('task/', DashboardTaskAppView.as_view(), name="task-home"),
    path('task/public', DashboardTaskAppViewPublic.as_view(), name="task-home-public"),
    path('task/new_task/', TaskCreateView.as_view(), name='task-create'),
    path('task/<int:pk>/', TaskDetailView.as_view(), name='task-detail'),
    path('task/<int:pk>/update', TaskUpdateView.as_view(), name='task-update'),
    path('task/<int:pk>/delete', TaskDeleteView.as_view(), name='task-delete'),
    path('task/<int:pk>/comment', CommentCreate.as_view(), name='task-comment'),
    path('docs/', views.doc_taskapp, name="task-doc"),
]

  

Что я хотел бы сделать, так это после отправки перенаправить пользователя на подробную информацию о задаче, где находится комментарий.. Я пытался return redirect('task-details') , но не сработало. После прочтения документов, я думаю, проблема в том, что я пытаюсь получить доступ к информации (данным) из задачи (модели) в комментарии (модели), и я делаю неправильно, возможно ли это сделать? И можно ли вызвать class CommentCreate(CreateView) форму в модальном? или абсолютно необходимо иметь template.html ?

Заранее спасибо за ваше время и помощь!

Ответ №1:

Похоже, вы ищете перенаправление на страницу сведений о задаче с помощью PK, поэтому:

для просмотра функции: верните перенаправление (‘task-detail’, pk = pk)

Обновление: для представления на основе классов: вернуть перенаправление (‘task-detail’, self.kwargs [‘pk’])

Комментарии:

1. Привет, Эд, спасибо за ваш комментарий, но это не сработало … когда я отправляю форму, которую получаю NameError at /task/35/comment name 'pk' is not defined

2. Ах, да. Другой формат для представлений на основе классов и представлений на основе. Стекло, я мог бы помочь.

Ответ №2:

Благодаря @Ed Kohler я узнал, что вы дали мне правильный ход мыслей! Спасибо!

 class CommentCreate(CreateView):
model = Comment
fields = ['body']

def form_valid(self, form):
    form.instance.task_id = self.kwargs['pk']
    form.instance.author = self.request.user
    form.instance.created = timezone.now()
    form.save()
    return redirect('task-detail', pk=self.kwargs['pk'])
  

Еще раз спасибо!