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?