【问题标题】:getting error while saving a data into database in django using .save() method使用 .save() 方法将数据保存到 django 中的数据库时出错
【发布时间】:2021-03-08 09:41:44
【问题描述】:

我创建了 2 个模型。

from django.db import models
from django.contrib.auth.models import User
class categories(models.Model):
    title = models.CharField(max_length=100)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    def __str__(self):
        return self.title

class tasks(models.Model):
    title = models.CharField(max_length=100)
    description = models.TextField()
    category = models.ForeignKey(categories, on_delete=models.CASCADE)
    def __str__(self):
        return self.title

并根据这些模型创建了表单。 view.py 是

from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from django.contrib.auth.models import User
from django.db import IntegrityError
from django.contrib.auth import login, logout, authenticate
from .forms import CategoriesForm,TaskForm
from .models import categories,tasks
from django.utils import timezone
from django.contrib.auth.decorators import login_required

def home(request):
    return render(request, 'user/home.html')

def signupuser(request):
    if request.method == 'GET':
        return render(request, 'user/signupuser.html', {'form':UserCreationForm()})
    else:
        if request.POST['password1'] == request.POST['password2']:
            try:
                user = User.objects.create_user(request.POST['username'], password=request.POST['password1'])
                user.save()
                login(request, user)
                return redirect('currentcategories')
            except IntegrityError:
                return render(request, 'user/signupuser.html', {'form':UserCreationForm(), 'error':'That username has already been taken. Please choose a new username'})
        else:
            return render(request, 'user/signupuser.html', {'form':UserCreationForm(), 'error':'Passwords did not match'})

def loginuser(request):
    if request.method == 'GET':
        return render(request, 'user/loginuser.html', {'form':AuthenticationForm()})
    else:
        user = authenticate(request, username=request.POST['username'], password=request.POST['password'])
        if user is None:
            return render(request, 'user/loginuser.html', {'form':AuthenticationForm(), 'error':'Username and password did not match'})
        else:
            login(request, user)
            return redirect('currentcategories')

@login_required
def logoutuser(request):
    if request.method == 'POST':
        logout(request)
        return redirect('home')

@login_required
def createcategories(request):
    if request.method == 'GET':
        return render(request, 'user/createcategories.html', {'form':CategoriesForm()})
    else:
        try:
            form = CategoriesForm(request.POST)
            newcategory = form.save(commit=False)
            newcategory.user = request.user
            newcategory.save()

            return redirect('currentcategories')
        except ValueError:
            return render(request, 'user/createcategories.html', {'form':CategoriesForm(), 'error':'Bad data passed in. Try again.'})
    
@login_required
def currentcategories(request):

    categ = categories.objects.filter(user=request.user)
    return render(request, 'user/currentcategories.html', {'categories':categ})

@login_required
def viewcategory(request, categories_pk):
    categ = get_object_or_404(categories, pk=categories_pk, user=request.user)
    if request.method == 'GET':
        form = CategoriesForm(instance=categories)
        return render(request, 'user/viewcategory.html', {'categories':categ, 'form':form})
    else:
        try:
            form = CategoriesForm(request.POST, instance=user)
            form.save()
            return redirect('currentcategories')
        except ValueError:
            return render(request, 'user/viewcategory.html', {'categories':categ, 'form':form, 'error':'Bad info'})

@login_required
def deletecategories(request, categories_pk):
    categ = get_object_or_404(categories, pk=categories_pk, user=request.user)
    if request.method == 'POST':
        categ.delete()
        return redirect('currentcategories')

@login_required
def task(request,categories_pk):
    categ = get_object_or_404(categories, pk=categories_pk, user=request.user)
    if request.method == 'GET':
        form = TaskForm(instance = tasks)
        return render(request, 'user/task.html', {'categories':categ, 'form':form})
    else:
        try:
            form = TaskForm(request.POST, instance=tasks)
            form.save()
            return redirect('currentcategories')
        except ValueError:
            return render(request, 'user/viewcategory.html', {'categories':categ, 'form':form, 'error':'Bad info'})

@login_required
def createtask(request, categories_pk):
    if request.method == 'GET':
        return render(request, 'user/createtask.html', {'form':TaskForm()})
    else:
        try:
            form = TaskForm(request.POST)
            newtask = form.save(commit=False)
            newtask.user = request.user
            newtask.category_id = request.POST.get('categories_pk')
            newtask.save()
            return redirect('currenttask')
        except ValueError:
            return render(request, 'user/createtask.html', {'form':TaskForm(), 'error':'Bad data passed in. Try again.'})
    
@login_required
def currenttask(request):

    tasks = task.objects.filter(categories=request.user.category)
    return render(request, 'user/currenttask.html', {'categories':categ})

我在 newtask.save() 处遇到错误

错误是:

IntegrityError at /categories/16/createtask/ “category_id”列中的空值违反非空约束 详细信息:失败行包含 (10, low, asdfgh, null)。 如何处理?

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    试试:

    category = models.ForeignKey(categories, null=True, on_delete=models.CASCADE)
    

    【讨论】:

    • 别忘了做迁移,做完再迁移
    【解决方案2】:

    您需要使用传递给视图categories_pk的关键字参数:

    @login_required
    def createtask(request, categories_pk):
        if request.method == 'POST':
            form = TaskForm(request.POST)
            if form.is_valid():
                form.instance.user = request.user
                form.instance.category_id = categories_pk
                newtask = form.save()
                return redirect('currenttask')
        else:
            form = TaskForm()
        return render(request, 'user/createtask.html', {'form':TaskForm()})
    

    注意:不要传递'error':'Bad data passed in. Try again.' 进入上下文使用表格错误。 form.field_name.errors 包含字段错误和form.non_field_errors 包含非字段 错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      • 1970-01-01
      • 2013-02-28
      • 2015-02-12
      • 1970-01-01
      • 2017-05-13
      相关资源
      最近更新 更多