#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'])
Еще раз спасибо!