在django DetailView中更新项目

我试图更好地理解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/ 比如说?

解决方案:

为了回答我的最后一个问题,现在我觉得很简单,我只是覆盖了““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) 

这样,当我 “执行任务 “时,我就会停留在网址上。tasks/1/. 感谢@孔夫子的提示。

给TA打赏
共{{data.count}}人
人已打赏
未分类

根据另一个值在Microsoft Access表格中检索最近的值。

2022-9-8 9:43:17

未分类

将向量分割成n个数量的列表对象(R)

2022-9-8 9:43:19

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索