【问题标题】:When adding a new query in Django, the foreign key gets the value NULL在 Django 中添加新查询时,外键获取值 NULL
【发布时间】: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
  • 该死,你是英雄,我是白痴。就是这样,谢谢,非常感谢您的帮助!:)

标签: django sqlite


【解决方案1】:

犯了一个错误,修正它。 new_tasks.taskgroup = taskgroup => new_tasks.task_group = taskgroup 感谢伊恩!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-27
    • 2011-01-22
    • 2016-04-17
    • 2015-04-26
    • 2021-06-03
    • 2016-03-31
    • 1970-01-01
    • 2011-09-01
    相关资源
    最近更新 更多