"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 需要它。我认为您应该在开始和结束字段上使用 DateFieldDateTimeField。不确定,但我认为您打算在那里放置一个日期值。


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})