2017-02-01 2 views
0

Я знаю, что есть много решений для этой проблемы, но они кажутся немного отличными от моих. Вот мой models.py:Значение null в столбце «user_id» нарушает непустое ограничение Django

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) 

Очень простая таблица, и я хочу, чтобы первичный ключ в Auth_user быть внешним ключом в моей Events таблицы. Поэтому, конечно, это означало бы, что 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 таблицы. с уникальным id. Однако, когда я пытаюсь отправить форму, я получаю нулевое значение для столбца user. Есть идеи?

+0

'Events.objects.create (name = name, start = start, end = end)' Пользователь нигде не установлен ... В отдельной заметке вы должны использовать [ModelForm] (https: // docs .djangoproject.com/en/1.10/themes/forms/modelforms /) для чего-то подобного, сэкономит много работы. –

+2

@jens, вероятно, это был ответ. Также сообщите оператору, как выполнить правильную проверку is_authenticated. – e4c5

+0

Ждите, извините, не должен ли пользователь поставить ставку в models.py? 'user = models.ForeignKey (settings.AUTH_USER_MODEL)' – anderish

ответ

0

Делать то, что вы имеете прямо сейчас работы:

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) 

Некоторые лучшие практики: Используя ModelForm (обратите внимание, есть class based generic views, что сделать это проще тоже), а 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}) 
+0

Спасибо, я действительно знаю модельную форму. Однако для этого я использую Модальную форму JQuery. Поэтому я использую ajax для отправки данных. – anderish

+0

Я бы посоветовал не использовать Django Forms для использования javascript - вам не нужно выбирать между тем или другим (я пошел по этой дороге, она запуталась), они могут играть вместе. Например, в вашем случае вы можете отобразить форму вручную, но в своем представлении передать запрос.POST в экземпляр формы для проверки (он также превращает все значения в объекты Python для вас). –

0

Просто добавьте экземпляр пользователя, потому что он требуется Events. Я думаю, вы должны использовать DateField или DateTimeField в начале и конце поля. Не уверен, но я думаю, что вы планируете поставить там значение даты.


Events.objects.create(user=request.user, name=name, start=start, end=end) 

Вы также должны добавить @login_required для вашей функции.

+1

На самом деле, у меня есть промежуточное ПО, предусмотренное для этой 'login_required' части, поэтому мне не нужно это распространять. – anderish

+0

Хорошо. вы можете просто назначить 'request.user' – Ralph

0

Мое решение заключается в следующем:


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

Это в порядке решения? Может ли быть что-то лучше?

+1

пользователю user_id. request.user уже возвращает объект 'User', нет необходимости в другом запросе' user_id = User.objects.get (username = user) .pk' – Ralph