2017-02-01 16 views
0

Ich weiß, dass es viele Lösungen für dieses Problem gibt, aber sie scheinen ein bisschen anders als meins. Hier ist meine models.py:Nullwert in Spalte "user_id" verletzt Nicht-Null-Bedingung 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) 

Sehr einfacher Tisch, und ich mag, dass die Primärschlüssel in Auth_user der Fremdschlüssel in meinem Events Tisch sein. Das würde natürlich bedeuten, dass ein User eingeloggt und authentifiziert sein muss, damit dies funktioniert. In meinem views.py ich habe:

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

Die print-Anweisung die aktuellen Benutzer gedruckt wird abgemeldet in Ich kann bestätigen, dass dieser Teil zeigt nicht, dass ein Benutzer in und dass dieser Benutzer angemeldet ist, ist in der auth_user Tabelle. mit einem einzigartigen id. Wenn ich jedoch versuche, ein Formular zu senden, erhalte ich einen Nullwert für die user Spalte. Irgendwelche Ideen?

+0

'Events.objects.create (Name = Name, Start = Start, Ende = Ende)' Der Benutzer wird nirgendwo festgelegt ... In einer separaten Notiz sollten Sie ein [ModelForm] (https: // docs .djangoprojekt.de/de/1.10/topics/forms/modelforms /) für so etwas spart viel Arbeit. –

+2

@jens, das sollte wahrscheinlich eine Antwort gewesen sein. Sagen Sie dem op, wie man eine ordnungsgemäße is_authenticated Prüfung durchführt. – e4c5

+0

Warten Sie entschuldigen, sollte der Benutzer nicht schon gesetzt in der models.py wetten? 'user = models.ForeignKey (settings.AUTH_USER_MODEL)' – anderish

Antwort

0

zu machen, was Sie haben jetzt Arbeit:

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) 

Einige bessere Praktiken: eine Verwendung ModelForm (beachten Sie, dass class based generic views sind, dass dies einfacher zu machen), und die login_required Dekorateur

# 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

Vielen Dank, mir ist das Model-Formular tatsächlich bekannt. Zu diesem Zweck benutze ich Jquery's Modal Form. Also verwende ich Ajax, um die Daten zu senden. – anderish

+0

Ich würde davor warnen, Django Forms zu benutzen, um Javascript zu benutzen - Sie müssen sich nicht zwischen dem einen oder dem anderen entscheiden (ich ging den Weg hinunter, es wird chaotisch), sie können zusammen spielen. In Ihrem Fall können Sie das Formular beispielsweise manuell rendern, aber in Ihrer Ansicht die Anfrage weitergeben.POST an die Formularinstanz zur Validierung (es werden auch alle Werte in Python-Objekte für Sie umgewandelt). –

0

Fügen Sie einfach die Benutzerinstanz hinzu, da sie von Events benötigt wird. Ich denke, Sie sollten DateField oder auf Start und Ende Feld verwenden. Nicht sicher, aber ich denke, dass Sie dort einen Datumswert eingeben möchten.


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

Sie sollten auch eine @login_required für Ihre Funktion hinzufügen. diese

+1

Eigentlich habe ich eine Middleware für diesen 'login_required' Teil, also muss ich das nicht überall hinstellen. – anderish

+0

Ok. Sie können einfach 'request.user' zuweisen – Ralph

0

ist meine Lösung:


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

Ist das eine Ordnung Lösung? Könnte es etwas besseres geben?

+1

Benutzer-ID für Benutzer ändern. request.user gibt bereits ein 'User'-Objekt zurück, keine weitere Abfrage' user_id = User.objects.get (username = user) .pk' – Ralph

Verwandte Themen