【发布时间】:2020-12-23 08:18:00
【问题描述】:
我仍在学习编程,目前正在尝试使用 Django。
目前我正在尝试构建一个任务管理器,但是当我尝试添加新的 Tasks(def new_tasks) 时,它应该与 TaskGroup 相关,而不是 task_group_id与 NULL 相关,我似乎无法弄清楚为什么。我相信原因是views.py-> def new_tasks中的某个地方。非常感谢任何帮助。
结构:
Project 1
Task Group 1
Tasks 1
Task 1
Task 2
Task 3
Tasks 2
Task 4
Task 5
Task Group 2
Tasks 3
Task 6
Project 2
Task Group 3
Tasks 4
Task 7
Task 8
将任务组与项目相关联,但将任务与任务组相关联会给出 NUll 值。 image of database
Models.py
from django.db import models
from django.contrib.auth.models import User
class Project(models.Model):
"""A project the user is working on."""
text = models.CharField(max_length=200)
date_added = models.DateTimeField(auto_now_add=True)
owner = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
"""Return a string representation of the model."""
return self.text
class TaskGroup(models.Model):
""" Title of a group of tasks """
project = models.ForeignKey(Project, null=True, on_delete=models.CASCADE)
title = models.CharField(max_length=100, blank=True, default='')
desc = models.CharField(max_length=300, default='')
date_added = models.DateTimeField(auto_now_add=True)
def __str__(self):
""" Return a string representation of the model. """
return self.title
class Tasks(models.Model):
""" Will be the title/segment that will contain the task items """
task_group = models.ForeignKey(TaskGroup, null=True, on_delete=models.CASCADE)
title = models.CharField(max_length=100, default='')
date_added = models.DateTimeField(auto_now_add=True)
def __str__(self):
""" Return a string representation of the model. """
return self.title
views.py
from django.shortcuts import render, redirect
from .models import Project, TaskGroup, Task, Tasks
from .forms import ProjectForm, TasksForm, TaskGroupForm
from django.contrib.auth.decorators import login_required
from django.http import Http404
from django.contrib import messages
# Delete
from django.core.exceptions import PermissionDenied
from django.urls import reverse
@login_required
def taskgroup(request, task_id):
"""Show a single task"""
taskgroup = TaskGroup.objects.get(id=task_id)
tasks = taskgroup.tasks_set.all()
# Make sure the task belongs to the current user.
project = taskgroup.project
if project.owner != request.user:
raise Http404
context = {'taskgroup':taskgroup, 'tasks': tasks}
return render(request, 'tasks/taskgroup.html', context)
@login_required
def task(request, task_id):
"""Show a single task"""
tasks = Task.objects.get(id=task_id)
# Make sure the task belongs to the current user.
project = tasks.project
if project.owner != request.user:
raise Http404
context = {'tasks':tasks}
return render(request, 'tasks/task.html', context)
@login_required
def new_project(request):
"""Add new project"""
if request.method != 'POST':
# No data submitted; create a blank form.
form = ProjectForm()
else:
# POST data submitted; process data.
form = ProjectForm(data=request.POST)
if form.is_valid():
new_project = form.save(commit=False)
new_project.owner = request.user
new_project.save()
return redirect('tasks:projects')
# Display a blank or invalid form.
context = {'form': form}
return render(request, 'tasks/new_project.html', context)
@login_required
def new_taskgroup(request, project_id):
""" Add new task """
project = Project.objects.get(id=project_id)
# Make sure the task belongs to the current user.
if project.owner != request.user:
raise Http404
if request.method != 'POST':
# No data submitted; create a blank form.
form = TaskGroupForm()
else:
# POST data submitted; process data.
form = TaskGroupForm(data=request.POST)
if form.is_valid():
new_taskgroup = form.save(commit=False)
new_taskgroup.project = project
new_taskgroup.save()
return redirect('tasks:project', project_id=project_id)
# Display a blank or invalid form.
context = {'project': project, 'form': form}
return render(request, 'tasks/new_taskgroup.html', context)
@login_required
def new_tasks(request, taskgroup_id):
""" Add new task """
taskgroup = TaskGroup.objects.get(id=taskgroup_id)
# Make sure the task belongs to the current user.
project = taskgroup.project
if project.owner != request.user:
raise Http404
if request.method != 'POST':
# No data submitted; create a blank form.
form = TasksForm()
else:
# POST data submitted; process data.
form = TasksForm(data=request.POST)
if form.is_valid():
new_tasks = form.save(commit=False)
new_tasks.taskgroup = taskgroup
new_tasks.save()
return redirect('tasks:taskgroup', task_id=taskgroup_id)
# Display a blank or invalid form.
context = {'taskgroup': taskgroup, 'form': form}
return render(request, 'tasks/new_tasks.html', context)
Forms.py
from django import forms
from .models import Project, TaskGroup, Task, Tasks
class ProjectForm(forms.ModelForm):
class Meta:
model = Project
fields = ['text']
labels = {'text': ''}
class TaskGroupForm(forms.ModelForm):
class Meta:
model = TaskGroup
fields = ['title', 'desc']
labels = {'desc': 'Description:','title': 'Title:'}
widgets = {'desc': forms.Textarea(attrs={'cols':80})}
class TasksForm(forms.ModelForm):
class Meta:
model = Tasks
fields = ['title']
labels = {'title': 'title:'}
urls.py
"""Defines URL patterns for tasks"""
from django.urls import path
from . import views
app_name = 'tasks'
urlpatterns = [
# Home page
path('', views.index, name='index'),
# Page that shows all projects.
path('taskmanager/', views.projects, name='projects'),
# Detail page for a single project.
path('taskmanager/<int:project_id>/', views.project, name='project'),
# Detail page for a single taskgroup.
path('taskmanager/task/<int:task_id>/', views.taskgroup, name='taskgroup'),
# Detail page for a single task.
path('taskmanager/task/<int:task_id>/', views.task, name='task'),
# Page for adding a new project
path('new_project/', views.new_project, name='new_project'),
# Page for adding new task group
path('new_taskgroup/<int:project_id>/', views.new_taskgroup, name='new_taskgroup'),
# Page for adding new task
path('new_tasks/<int:taskgroup_id>/', views.new_tasks, name='new_tasks'),
# Page for editing task
path('edit_task/<int:task_id>/', views.edit_task, name='edit_task'),
]
urlpatterns.extend(
[
path('delete/<int:task_id>/', views.delete_task, name='delete_task'),
]
)
【问题讨论】:
-
ForeignKey中有一个下划线:new_tasks.task_group = taskgroup -
该死,你是英雄,我是白痴。就是这样,谢谢,非常感谢您的帮助!:)