Обновить элемент в django DetailView - PullRequest
0 голосов
/ 09 апреля 2020

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

class Project(models.Model):
    project_name = models.CharField(max_length=100)

class Task(models.Model):
    project = models.ForeignKey(Project, on_delete=models.CASCADE)
    task_name = models.CharField(max_length=100)
    last_performed = models.DateField('last time peformed')

Шаблон для списка задач:

<h1>{{ project.project_name }}</h1>
<ul>
{% for task in project.task_set.all %}
    <li>{{ task.task_name }} ({{ task.last_performed }}) 
    <a href="{% url 'update' 1 task.task_name %}">Perform</a>
    </li>
{% endfor %}
</ul>

и view.py

class ProjectView(generic.ListView):
    template_name = 'tasks/index.html'
    context_object_name = 'project_list'

    def get_queryset(self):
        return Project.objects.all()

class TaskView(generic.DetailView):
    model = Project
    template_name = 'tasks/detail.html'

def update(request, project_id, task_name):
    project = get_object_or_404(Project, pk=project_id)
    task = project.task_set.filter(task_name=task_name).first()
    task.last_performed = timezone.now().today()
    task.save()
    return render(request, 'tasks/detail.html', {'project': project})

У меня есть следующие шаблоны

urlpatterns = [ 
    path('', views.ProjectView.as_view(), name='index'),
    path('<int:pk>/', views.TaskView.as_view(), name='detail'),
    path('<int:pk>/<task_name>/', views.update, name='update'),
]

Теперь мой вопрос заключается в следующем. Пока это работает, мне было интересно, что было бы чистым решением для update. Дело в том, что в коде есть несколько общих строк с TaskView, если бы я написал его следующим образом:

def detail(request, project_id):
    project = get_object_or_404(Project, pk=project_id)
    return render(request, 'tasks/detail.html', {'project': project})

Также есть способ обновить его, не меняя путь к tasks/1/clean/ например?

1 Ответ

0 голосов
/ 23 апреля 2020

Чтобы ответить на мой последний вопрос, который сейчас мне кажется очень тривиальным, я просто переопределил метод `` post`` следующим образом

    def post(self, request, pk):
        project = get_object_or_404(Project, pk=pk)
        task_name = request.POST.get('task', None)
        task = project.task_set.filter(task_name=task_name).first()
        task.last_performed = timezone.now().today()
        task.save()
        return super().get(request, pk) 

Таким образом, когда я «выполняю задачу», я остаться на URL tasks/1/. Спасибо @kungphu за подсказки.

...