"user_id" 列中的空值违反了非空约束 Django
null value in column "user_id" violates not-null constraint Django
我知道这个问题有很多解决方案,但它们似乎与我的有所不同。这是我的 models.py:
from __future__ import unicode_literals
from django.db import models
from django.conf import settings
from django.contrib.auth.models import User
from django.contrib.postgres.fields import HStoreField
# Create your models here.
class Events(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL)
name = models.CharField(max_length=32)
start = models.CharField(max_length=32)
end = models.CharField(max_length=32)
非常简单 table,我希望 Auth_user
中的主键成为 Events
table 中的外键。所以当然这意味着 User
必须登录并验证才能工作。在我的 views.py 中,我有:
def createEvent(request):
if request.method == "POST":
user = request.user
print (user) # Check for Authentication
name = request.POST['name']
start = request.POST['start']
end = request.POST['end']
Events.objects.create(
name = name,
start = start,
end =end,
)
打印语句将打印出当前登录的用户。我可以确认这部分确实显示用户已登录并且该用户在 auth_user
table 中独一无二 id
。但是,当我尝试提交表单时,user
列的值为空。有什么想法吗?
只需添加用户实例,因为 Events
需要它。我认为您应该在开始和结束字段上使用 DateField
或 DateTimeField
。不确定,但我认为您打算在那里放置一个日期值。
Events.objects.create(<b>user=request.user</b>, name=name, start=start, end=end)
您还应该为您的函数添加一个 @login_required
。
我的解决方案是这样的:
from django.contrib.auth.models import User
user = request.user
<b>user_id = User.objects.get(username=user).pk</b>
name = request.POST['name']
start = request.POST['start']
end = request.POST['end']
Events.objects.create(
<b>user_id=user_id,</b>
name = name,
start = start,
end =end,
)
这样的解决方案好吗?还有更好的吗?
让你现在拥有的工作:
def createEvent(request):
if request.method == "POST":
user = request.user
print (user) # Check for Authentication
name = request.POST['name']
start = request.POST['start']
end = request.POST['end']
# The user has to be included before being saved
Events.objects.create(name=name, start=start, end=end, <b>user=user</b>)
一些更好的做法:
使用 ModelForm (note there are class based generic views that make this easier too), and the login_required 装饰器
# forms.py
from django.forms import ModelForm
from .models import Event
class EventForm(ModelForm):
class Meta:
model = Event
fields = ('user', 'start', 'end', 'name')
# views.py
from django.contrib.auth.decorators import login_required
@login_required
def create_event(request):
if request.POST:
form = EventForm(request.POST)
if form.is_valid():
form.save()
else:
form = EventForm()
return render(..., {'form': form})
我知道这个问题有很多解决方案,但它们似乎与我的有所不同。这是我的 models.py:
from __future__ import unicode_literals
from django.db import models
from django.conf import settings
from django.contrib.auth.models import User
from django.contrib.postgres.fields import HStoreField
# Create your models here.
class Events(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL)
name = models.CharField(max_length=32)
start = models.CharField(max_length=32)
end = models.CharField(max_length=32)
非常简单 table,我希望 Auth_user
中的主键成为 Events
table 中的外键。所以当然这意味着 User
必须登录并验证才能工作。在我的 views.py 中,我有:
def createEvent(request):
if request.method == "POST":
user = request.user
print (user) # Check for Authentication
name = request.POST['name']
start = request.POST['start']
end = request.POST['end']
Events.objects.create(
name = name,
start = start,
end =end,
)
打印语句将打印出当前登录的用户。我可以确认这部分确实显示用户已登录并且该用户在 auth_user
table 中独一无二 id
。但是,当我尝试提交表单时,user
列的值为空。有什么想法吗?
只需添加用户实例,因为 Events
需要它。我认为您应该在开始和结束字段上使用 DateField
或 DateTimeField
。不确定,但我认为您打算在那里放置一个日期值。
Events.objects.create(<b>user=request.user</b>, name=name, start=start, end=end)
您还应该为您的函数添加一个 @login_required
。
我的解决方案是这样的:
from django.contrib.auth.models import User
user = request.user
<b>user_id = User.objects.get(username=user).pk</b>
name = request.POST['name']
start = request.POST['start']
end = request.POST['end']
Events.objects.create(
<b>user_id=user_id,</b>
name = name,
start = start,
end =end,
)
这样的解决方案好吗?还有更好的吗?
让你现在拥有的工作:
def createEvent(request):
if request.method == "POST":
user = request.user
print (user) # Check for Authentication
name = request.POST['name']
start = request.POST['start']
end = request.POST['end']
# The user has to be included before being saved
Events.objects.create(name=name, start=start, end=end, <b>user=user</b>)
一些更好的做法: 使用 ModelForm (note there are class based generic views that make this easier too), and the login_required 装饰器
# forms.py
from django.forms import ModelForm
from .models import Event
class EventForm(ModelForm):
class Meta:
model = Event
fields = ('user', 'start', 'end', 'name')
# views.py
from django.contrib.auth.decorators import login_required
@login_required
def create_event(request):
if request.POST:
form = EventForm(request.POST)
if form.is_valid():
form.save()
else:
form = EventForm()
return render(..., {'form': form})