简而言之,我正在制作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)
做些事情,但是我不知道能够显示所有这些内容的条件:
谢谢您的帮助。
答案 0 :(得分:0)
我能够弄清楚,基本上hasattr()
可以解决问题:
if hasattr(task.project_id, 'pk'):
project = get_object_or_404(Project, pk=task.project_id.pk)
谢谢