【发布时间】:2019-09-08 16:43:21
【问题描述】:
我正在处理一个 Todo 列表,该列表有不同的用户和他们自己的列表。 最初我的models.py为:
from django.db import models
from django.contrib.auth.models import User
class Todo(models.Model):
text = models.CharField(max_length=40, default='Test User')
complete = models.BooleanField(default = False)
task_priority = models.CharField(max_length=40, default='high')
def __str__(self):
return self.text
但是当我试图将单个用户与其自己的一组待办事项(文本字段)及其优先级和状态联系起来时。
我这样添加一对一字段:
from django.db import models
from django.contrib.auth.models import User
class Todo(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE,primary_key='user_id') #new
text = models.CharField(max_length=40, default='Test User')
complete = models.BooleanField(default = False)
task_priority = models.CharField(max_length=40, default='high')
def __str__(self):
return self.text
它抛出了这样的错误:
字段错误在 / 无法将关键字“id”解析为字段。选项有:完成、task_priority、text、user、user_id
我没有完全理解一对一字段的概念,并且查看在线教程我很困惑天气我需要制作另一个表并将其链接到 Todo 表或添加另一个带有一些主键的字段?
帮助我理解这个概念。 提前致谢。
编辑: views.py 文件:
from django.shortcuts import render, redirect
from .models import Todo
from .form import TodoForm,ContactForm
import datetime
from django.conf import settings
from django.utils import timezone
from django.views.decorators.http import require_POST
from django.core.mail import send_mail, BadHeaderError
from django.http import HttpResponse, HttpResponseRedirect
import json
def index(request):
todo_list = Todo.objects.order_by('id')
form = TodoForm()
mydate = datetime.datetime.now()
context = {'todo_list': todo_list, 'form': form, 'mydate':mydate}
return render(request,'todo/index.html',context)
def login(request):
return render(request, 'todo/login.html')
@require_POST
def addTodo(request):
form = TodoForm(request.POST)
text_input = form.get_cleaned_data['text']
priority_input = form.get_cleaned_data['task_priority']
if form.is_valid():
new_todo = Todo(text = text_input, task_priority = priority_input)
# new_todo = Todo(text = request.POST['text'])
new_todo.save()
return redirect('index')
def completeTodo(request, todo_id):
todo = Todo.objects.get(pk=todo_id)
todo.complete = True
todo.save()
return redirect('index')
def deleteCompleted(request):
Todo.objects.filter(complete__exact=True).delete()
return redirect('index')
def deleteAll(request):
Todo.objects.all().delete()
return redirect('index')
def emailView(request):
todo = Todo.objects.all();
task_list = []
status_list = []
for item in todo:
stritem=str(item)
task_list.append(stritem)
if item.complete == True:
status_list.append('complete')
else:
status_list.append('incomplete')
if request.method == 'GET':
form = ContactForm()
else:
form = ContactForm(request.POST)
if form.is_valid():
from_email = form.cleaned_data['from_email']
message = form.cleaned_data['message']
#maillist = Todo.objects.all()
email_list=dict(zip(task_list,status_list))
strlist = json.dumps(email_list)
content = message + strlist
try:
send_mail('Todo List', content ,settings.EMAIL_HOST_USER,[from_email])
except BadHeaderError:
return HttpResponse('Invalid header found.')
return redirect('success')
return render(request, "email.html", {'form': form})
def successView(request):
return HttpResponse('Success! Thank you for your message.')
新模型.py:
from django.db import models
from django.contrib.auth.models import User
class Todo(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE)
text = models.CharField(max_length=40, default="")
complete = models.BooleanField(default = False)
task_priority = models.CharField(max_length=40, default='high')
def __str__(self):
return self.text
遇到
IntegrityError at /add NOT NULL 约束失败:todo_todo.user_id
【问题讨论】:
-
您能否发布指向 '/' 的视图,如您的 url 中所述,以及视图正在呈现的模板?
-
如果你的情况是单身可以有多个待办事项,那么使用
ForeignKey而不是OneToOneField。和primary_key=True -
出错的可能性可能是您使用
Todo.objects.get('id')来获取 Todo 对象的 id。所以如果你在这里发表你的观点会更容易。