2016-08-05 84 views
0

Ich versuche, ein Formular zu erstellen, mit dem Benutzer eine Datei hochladen können (eine Nur-Text-Wörterbuchdatei). Hier ist mein Modell:NOT NULL Constraint fehlgeschlagen: owner_id in Formular speichern

from django.conf import settings 
from django.db import models 
import uuid 


class Dictionary(models.Model): 
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 
    owner = models.ForeignKey(settings.AUTH_USER_MODEL) 
    file = models.FileField(upload_to='uploads/%y/%m/%d') 
    timestamp = models.DateTimeField(auto_now_add=True) 

Hier ist die Form, die ich damit benutze. Ich möchte nur den Dateiparameter angeben, den Benutzer festlegen können. Der Besitzer Ich beabsichtige, von der Anfrage Benutzer eingestellt werden:

from django.forms import ModelForm 

from dic.models import Dictionary 


class DictionaryForm(ModelForm): 

    class Meta: 
     model = Dictionary 
     fields = ['file'] 

    def __init__(self, owner, *args, **kwargs): 
     self.owner = owner 
     super().__init__(*args, **kwargs) 

Hier ist meine Ansicht Code, der die Post-Daten, Dateien und Benutzer in das Formular sendet:

from django.contrib.auth.decorators import login_required 
from django.http import HttpResponse, HttpResponseRedirect 
from django.shortcuts import render 

from dic.forms import DictionaryForm 

@login_required 
def upload(request): 
    if request.method == 'POST': 
     form = DictionaryForm(request.user, request.POST, request.FILES) 
     if form.is_valid(): 
      form.save() 
      return HttpResponseRedirect('/dic/upload_success') 
    else: 
     form = DictionaryForm(request.user) 
    return render(request, 'dic/upload.html', {'form': form}) 

Und hier ist mein Versagen Testcode:

Die Assert-Zeile wird nie ausgeführt, weil zuerst ein Fehler auftritt. Der Fehler, der generiert wird, befindet sich in dem Ansichtscode bei form.save(). Der erzeugte Fehler ist:

django.db.utils.IntegrityError: NOT NULL constraint failed: dic_dictionary.owner_id 

Zwei Fragen. Wie setze ich den Besitzerwert im Formular richtig, damit dieser Fehler nicht auftritt? Und warum tritt der Fehler auf der form.save() Zeile auf, da is_valid() überprüft haben sollte, dass keine Fehler auftreten würden?

Antwort

2

is_valid() überprüft nur die Felder, die Sie im Formular angegeben haben (in diesem Fall - file). Das Formular ist gültig - Sie erhalten jedoch später einen Fehler, weil die anderen Einschränkungen des Modellfelds beim Speichern nicht erfüllt sind.

Die Übergabe der owner an das Formular wird nicht funktionieren, da das Formular dieses Feld nicht behandelt. Stattdessen müssen Sie die owner zum Modell hinzuzufügen, nachdem das Formular validiert, aber vor dem Speichern:

if request.method == 'POST': 
    form = DictionaryForm(request.POST, request.FILES) 
    if form.is_valid(): 
     obj = form.save(commit=False) 
     obj.owner = request.user 
     obj.save() 
     return HttpResponseRedirect('/dic/upload_success') 

(auch die __init__ Methode auf dem Formular entfernen).