Django-AttributeError:“ NoneType”对象没有属性“ pk”

时间:2020-10-13 20:09:06

标签: python django

简而言之,我正在制作ToDo应用,用户可以在其中存储他的待办事项和项目。项目由待办事项组成,可以与其他用户共享。我正在显示属于用户的所有待办事项和项目,但是当我尝试访问用户待办事项时,我得到:AttributeError: 'NoneType' object has no attribute 'pk'

访问项目内部的todo甚至访问其他人内部的todo时,一切正常。 这是日志:

 Traceback (most recent call last):
      File "C:\Users\dknapik\.virtualenvs\todo-licencjat-_Vlumx_M\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
        response = get_response(request)
      File "C:\Users\dknapik\.virtualenvs\todo-licencjat-_Vlumx_M\lib\site-packages\django\core\handlers\base.py", line 179, in _get_response
        response = wrapped_callback(request, *callback_args, **callback_kwargs)
      File "C:\Users\dknapik\.virtualenvs\todo-licencjat-_Vlumx_M\lib\site-packages\django\contrib\auth\decorators.py", line 21, in _wrapped_view
        return view_func(request, *args, **kwargs)
      File "C:\Users\dknapik\Documents\Software\Python\lic\todo-licencjat\task\views.py", line 126, in viewtask
        project = get_object_or_404(Project, pk=task.project_id.pk)

Exception Type: AttributeError at /task/4
Exception Value: 'NoneType' object has no attribute 'pk'

视图:

def displayTask(request, task_pk, task):
    if request.method == 'GET':
        form = TaskForm(instance=task)
        return render(request, 'task/viewtask.html', {'task': task, 'form':form})
    else:
        try:
            form = TaskForm(request.POST, instance=task)
            form.save()
            return redirect('currenttasks')
        except ValueError:
            return render(request, 'task/viewtask.html', {'task': task, 'form':form, 'error': 'Something went wrong'})

@login_required
def viewtask(request, task_pk):
    task = get_object_or_404(Task, pk=task_pk)
    project = get_object_or_404(Project, pk=task.project_id.pk)
    if request.user == task.task_owner:
        return displayTask(request, task_pk, task)
    elif task.project_id and project.participant1 == request.user:
        return displayTask(request, task_pk, task)
    else:
        raise Http404

和型号:

class Project(models.Model):
    title = models.CharField(max_length=100)
    project_owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name="owner")
    created = models.DateTimeField(auto_now_add=True)
    completed = models.DateTimeField(blank=True, null=True)
    participant1 = models.ForeignKey(User, on_delete=models.CASCADE, related_name="participant", blank=True, null=True)

class Task(models.Model):
    title = models.CharField(max_length=200)
    created = models.DateTimeField(auto_now_add=True)
    scheduled = models.DateTimeField(blank=True, null=True)
    completed = models.DateTimeField(blank=True, null=True)
    importance = models.BooleanField(default=False)
    task_owner = models.ForeignKey(User, on_delete=models.CASCADE)
    project_id = models.ForeignKey(Project, on_delete=models.CASCADE, blank=True, null=True)

我知道我需要对project = get_object_or_404(Project, pk=task.project_id.pk)做些事情,但是我不知道能够显示所有这些内容的条件:

  • 用户自己的待办事项
  • 用户在他的项目中要做的事
  • 在用户为参与者的项目内部做事

谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我能够弄清楚,基本上hasattr()可以解决问题:

if hasattr(task.project_id, 'pk'):
    project = get_object_or_404(Project, pk=task.project_id.pk)

谢谢