Я постараюсь дать как можно больше информации, не давая больше, чем мне нужно.
У меня есть класс 'Book', который, помимо других полей, связан с другим классом 'User', например:
from users.models import User
class Book(models.Model):
title = models.CharField(max_length=150)
owner = models.ForeignKey('users.User')
Эта 'Book' создается формой,которая закодирована так:
from django import forms
from books.models import Book
class BookForm(forms.ModelForm):
class Meta:
model = Book
fields = ["title"]
И эта форма отображается с шаблоном, который выглядит следующим образом:
<form method="post" action="">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" />
</form>
, который вызывается следующим представлением:
def create_book(request):
if request.user is None:
return redirect("/users/login/")
if request.method == "POST":
form = BookForm(request.POST)
if form.is_valid():
form.owner = request.user # FFFFFUUUUUUU
form.save()
return redirect("/books/")
else:
form = BookForm()
return render_to_response("books/create.html", {
"form": form,
}, context_instance=RequestContext(request))
Когда эта форма отправлена, она должна поместить новую книгу в базу данных, но я получаю сообщение об ошибке: IntegrityError at /books/create/ null value in column "owner_id" violates not-null constraint
Я предполагаю, что не правильно устанавливаю владельца.Что касается вышесказанного, form.owner = request.user, бит request.user устанавливается промежуточным ПО: из users.models import User
class UserMiddleware(object):
def process_request(self, request):
user_id = request.session.get("user_id")
if user_id is not None:
request.user = User.objects.get(pk=user_id)
else:
request.user = None
Так что это должен быть действительный пользователь (я могуубедитесь, что я вошел в систему с помощью других функций в моем коде).Я очень плохо знаком с Python / Django и держу пари, что мой способ установить владельца новой книги просто неверен, но, возможно, что-то еще не так.Если требуется дополнительная информация, пожалуйста, дайте мне знать, и я надеюсь, что это не слишком много!
Спасибо за помощь.