Django:通过表单为外键关联类与另一个类

0 投票
1 回答
1646 浏览
提问于 2025-04-16 07:46

我会尽量提供足够的信息,但不会多说。

我有一个叫做 '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 是通过中间件设置的:

from 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

你需要在保存表单后创建的 book 对象上设置用户,而不是在表单本身上设置。代码应该是:

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

使用 form.save(commit=False) 会返回一个未保存的 book 实例,你可以在将它保存到数据库之前自己进行修改。

撰写回答