Django: связывание класса с другим классом с внешним ключом при создании формой - PullRequest
0 голосов
/ 29 ноября 2010

Я постараюсь дать как можно больше информации, не давая больше, чем мне нужно.

У меня есть класс '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 и держу пари, что мой способ установить владельца новой книги просто неверен, но, возможно, что-то еще не так.Если требуется дополнительная информация, пожалуйста, дайте мне знать, и я надеюсь, что это не слишком много!

Спасибо за помощь.

1 Ответ

1 голос
/ 29 ноября 2010

Вам необходимо указать пользователя для объекта book, который создается путем сохранения формы, а не для самой формы.Код должен быть:

    if form.is_valid():
        book = form.save(commit=False)
        book.owner = request.user
        book.save()

Выполнение form.save(commit=False) возвращает несохраненный экземпляр book, который можно изменить самостоятельно перед сохранением в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...