2012-03-29 17 views
5

Tuhaf bir sorunum var. POST isteğiyle gönderilen bir formu doğrulamaya çalışıyorum ve bu form aslında dört modelin temeli üzerine kurulu.Yuvalanmış formları Django'ya kaydetme

fikri tüm formları doğrulamak ve daha sonra son kaydedilen modeli örnekleri temelinde yabancı tuşları atama, uygun sırayla, onları uygun şekilde kurtarmak. Ben düzgün form.is_valid() çağrı yoluyla doğrulanmıştır modelin dış anahtarına bir değer atamak çalıştığınızda

sorun

oluşur. Ancak bu özel yabancı anahtar " NULL olmayabilir" diyerek IntegrityError atar.

Aşağıda

Ben ne yapıyorum üzerinde size fikir verecektir kodu bulabilirsiniz:

Modelleri & formları defitinions: görünümleri birinde

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 

:

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! 

author_form.save() sırasında buna benzer bir hata alıyorum:

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

book.id'un bir tam sayı (int, kontrol ettim) anahtarının yakın zamanda kaydedilmiş olan Book kayıtlarının kimliği olduğundan eminim.

& kaydedilmemiş formda doğrulanmış yabancı anahtarı nasıl ayarlayabilirim, böylece veritabanına güvenli bir şekilde kaydedebilirim?

cevap

6

Django cleaned_data['book_id'] değeri ne umursamıyor böylece - bu sadece göz ardı edeceğiz.

Bunun yerine, kaydedilmemiş yazar örneğinde doğrudan kitap özelliğini ayarlamak gerekir:

o yardımcı
book = book_form.save() 
    author = author.form.save(commit=False) 
    author.book = book 
    author.save() 
+0

sayesinde. – Tadeck

3

Sen deneyebilirsiniz: Sen AuthorForm den book hariç tuttuktan

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()