2012-03-29 39 views
5

Tôi gặp vấn đề lạ. Tôi đang cố gắng xác thực một biểu mẫu được gửi qua yêu cầu POST và biểu mẫu này thực tế được xây dựng trên nền tảng của bốn mô hình.Lưu các hình thức lồng nhau trong Django

Ý tưởng là xác thực tất cả các biểu mẫu và sau đó lưu chúng theo đó, theo thứ tự thích hợp, gán khóa ngoài trên cơ sở các trường hợp mô hình đã lưu gần đây.

Sự cố xảy ra khi tôi cố gán giá trị cho khóa ngoại của mô hình đã được xác thực hợp lệ thông qua cuộc gọi form.is_valid(). Tuy nhiên, nó ném một số IntegrityError cho biết khóa ngoại ngoài cụ thể này "có thể không là NULL".

Dưới đây xin vui lòng tìm mã mà nên cung cấp cho bạn những ý tưởng về những gì tôi đang làm:

Models & hình thức defitinions:

class Author(models.Model): 
    name = models.CharField(blank=False, max_length=150) 
    book = models.OneToOneField('Book') # its important, one author has one book 

class Book(models.Model): 
    name = models.CharField(blank=False, max_length=150) 

class AuthorForm(ModelForm): 
    class Meta: 
     model = Author 
     exclude = ('book',) 

class BookForm(ModelForm): 
    class Meta: 
     model = Book 

Trong một trong những quan điểm:

if request.method == "POST": 
    author_form = AuthorForm(request.POST, prefix='author') 
    book_form = BookForm(request.POST, prefix='book') 
    if author_form.is_valid() and book_form.is_valid(): 
     book = book_form.save() 
     author_form.cleaned_data['book_id'] = book.id 
     author.form.save() # Error! 

Trong thời gian author_form.save() Tôi gặp lỗi tương tự như sau:

IntegrityError at /api/my_method 
myapp_author.book_id may not be NULL 

Tôi hoàn toàn chắc chắn rằng book.id là một số nguyên (int, tôi đã kiểm tra nó) với ID của hồ sơ gần đây đã lưu Book.

Bạn có biết làm cách nào để đặt khóa ngoại có xác thực & biểu mẫu chưa được lưu, vì vậy tôi có thể lưu an toàn vào cơ sở dữ liệu không?

Trả lời

6

Bạn đã loại trừ book từ AuthorForm, vì vậy Django không quan tâm những gì giá trị của cleaned_data['book_id'] là - nó sẽ chỉ cần bỏ qua nó.

Thay vào đó, bạn cần phải thiết lập thuộc tính sổ trực tiếp trên dụ tác giả chưa được lưu:

book = book_form.save() 
    author = author.form.save(commit=False) 
    author.book = book 
    author.save() 
+0

Nó giúp, cảm ơn. – Tadeck

3

Bạn có thể thử:

if author_form.is_valid() and book_form.is_valid(): 
    book = book_form.save() 
    author = author_form.save(commit=False) 
    author.book = book 
    author.save() 
Các vấn đề liên quan