#django #sqlite
#django #sqlite
Вопрос:
Я все еще изучаю программирование и в настоящее время экспериментирую с Django.
В настоящее время я пытаюсь создать диспетчер задач, но когда я пытаюсь добавить новые задачи (def new_tasks), он должен быть связан с TaskGroup , вместо этого task_group_id связан с NULL, и я не могу понять, почему. Я полагаю, что причина где-то в views.py -> определение 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.
образ базы данных
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'),
]
)
Комментарии:
1. В
ForeignKey
нем есть символ подчеркивания:new_tasks.task_group = taskgroup
2. Черт возьми, ты герой, а я идиот. Это было просто, спасибо, действительно ценю помощь!:)
Ответ №1:
Допустил ошибку, исправил ее. new_tasks.taskgroup = taskgroup
=> new_tasks.task_group = taskgroup
спасибо Iain!