2017-02-21 15 views
0

У меня есть две модели, есть книги и автора, и я добавить ManyToMany поле внутри книжной моделиДжанго ManyToMany CreateView поля в обеих таблицах

class Author(models.Model): 
    name = models.CharField(verbose_name='name', max_length=50) 
    created_at = models.DateTimeField(auto_now_add=True) 

    def __unicode__(self): 
     return unicode(self.name)  

class Book(models.Model): 
    title = models.CharField(verbose_name='title', max_length=50) 
    authors = models.ManyToManyField(Author) # Many to many 
    created_at = models.DateTimeField(auto_now_add=True)  

    def __unicode__(self): 
     return unicode(self.title) 

Если я хочу создать CreateView из книги и доступа авторов, я могу просто добавить код, как этого

class BookCreateView(CreateView): 
    model = Book 
    template_name = "books/book_create.html" 
    fields = ['title', 'authors'] 

, но то, что я хочу спросить, я хочу, чтобы создать CreateView от автора модели и добавить полеИменованную КНИГИ внутри него. Я пытался кодировать как этот

class AuthorCreateView(CreateView): 
    model = Author 
    template_name = "books/author_create.html" 
    fields = ['name', 'books'] 

и он показывает ошибку «Неизвестное поле (s) (книги), определенные для автора».

помогает мне мастера, я новичок в Джанго

Спасибо :)

ответ

0

Так как Author модели не имеет поле с именем books, вы не можете добавить, что в AuthorCreateView полях.

Что нужно сделать, сначала создайте экземпляр Author, а затем добавьте их как автора в экземпляр книг.

Пример.

book_instance.authors.add(author_instance) 
1

Теперь она решается с помощью формы и FormView, это мой код

это мой forms.py

class AuthorForm(Form): 
    name = forms.CharField() 
    books = forms.ModelMultipleChoiceField(Book.objects.all()) 

это мой views.py

class AuthorCreateView(FormView): 
    template_name = "books/author_create.html" 
    form_class = AuthorForm 

    def form_valid(self, form): 
     name = form.cleaned_data['name'] 
     books = form.cleaned_data['books'] 

     author = Author(name=name) 
     author.save() 
     book_list = Book.objects.filter(pk__in=books) 
     for book in book_list: 
      author.book_set.add(book) 

     return HttpResponse(author.book_set.all()) 

btw благодарю @kartikmaji, вы спасли мой день :)

Смежные вопросы