簡體   English   中英

使用.save() 方法將數據保存到 django 中的數據庫時出錯

[英]getting error while saving a data into database in django using .save() method

我創建了 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

並從這些模型中創建了 forms。 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() 收到錯誤

錯誤是:

/categories/16/createtask/ null 列“category_id”中的 IntegrityError 違反了非空約束細節:失敗行包含(10,低,asdfgh,空)。 如何處理這個?

嘗試:

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

您需要使用傳遞給視圖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.' 進入上下文使用 forms 錯誤。 form.field_name.errors包含字段錯誤, form.non_field_errors包含非字段錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM