Django:在通过表单创建时,使用外键将类链接到另一个类

时间:2010-11-29 14:12:29

标签: python django class foreign-keys

我会尝试提供尽可能多的信息,而不是提供超出我需要的信息。

我有一个班级'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导入用户

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 个答案:

答案 0 :(得分:1)

您需要将用户设置为通过保存表单而不是表单本身创建的book对象。代码应该是:

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

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