При добавлении нового запроса в Django внешний ключ получает значение NULL

#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!