Я пытаюсь лучше понять 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/
например?