[英]null value in column “user_id” violates not-null constraint Django
I know there are a lot of solutions for this problem but they seem a bit different than mine. 我知道有很多解决此问题的方法,但它们似乎与我的有所不同。 Here is my models.py:
这是我的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)
Very simple table and I want the primary key in Auth_user
to be the foreign key in my Events
table. 非常简单的表,我希望
Auth_user
的主键成为我的Events
表中的外键。 So of course this would mean that a User
has to be logged in and authenticated for this to work. 因此,这当然意味着
User
必须登录并经过身份验证才能正常工作。 In my views.py I have: 在我的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,
)
The print statement will print out the current user logged in. I can confirm that this part does show that a user is logged in and that this user is in the auth_user
table with a unique id
. print语句将打印出当前登录的用户。我可以确认这一部分的确显示了一个用户已登录,并且该用户位于
auth_user
表中,具有唯一id
。 However, when I try to submit a form, I get a null value for the user
column. 但是,当我尝试提交表单时,
user
列的值为空。 Any ideas? 有任何想法吗?
Just add the user instance because it's required by Events
. 仅添加用户实例,因为
Events
需要它。 I think you should use DateField
or DateTimeField
on start and end field. 我认为您应该在开始和结束字段上使用
DateField
或DateTimeField
。 Not sure but I think you plan to put a date value there. 不确定,但我认为您打算在其中放置一个日期值。
Events.objects.create(
user=request.user, name=name, start=start, end=end)
You should also add a @login_required
for your function. 您还应该为函数添加
@login_required
。
My solution is this: 我的解决方案是这样的:
from django.contrib.auth.models import User
user = request.user
user_id = User.objects.get(username=user).pk
name = request.POST['name']
start = request.POST['start']
end = request.POST['end']
Events.objects.create(
user_id=user_id,
name = name,
start = start,
end =end,
)
Is that an alright solution? 这是一个好的解决方案吗? Could there be something better?
会有更好的东西吗?
Making what you have right now work : 使您现在拥有的东西起作用 :
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,
user=user)
Some better practices: Using a ModelForm (note there are class based generic views that make this easier too), and the login_required decorator 一些更好的做法:使用ModelForm (请注意,还有基于类的通用视图也使此操作更加容易),以及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})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.