2010-11-29 48 views
0

我會盡量提供儘可能多的信息,而不會超出我的需要。Django:通過表單創建時,將類與外鍵鏈接到另一個類

我有,其他領域中,被鏈接到另一類「用戶」一類「書」,像這樣:

from users.models import User 
class Book(models.Model): 
    title = models.CharField(max_length=150)  
    owner = models.ForeignKey('users.User') 

這「書」由一種形式,它是編碼等創建所以:

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("https://stackoverflow.com/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

您需要在通過保存表單創建的book對象上設置用戶,而不是在窗體本身上。該代碼應該是:

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

form.save(commit=False)返回一個未保存book例如,您可以將其保存到數據庫之前修改自己。

+0

完美,感謝您的幫助! – Joseph 2010-11-29 14:38:32

相關問題