Поля Django ManyToMany CreateView в обеих таблицах

У меня есть две модели: Book и Author, и я добавляю поле ManyToMany внутри модели Book.

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 from Author и добавить в нее поле с именем books. Я пытался кодировать так

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

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

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

Спасибо :)


person Luthfi    schedule 21.02.2017    source источник


Ответы (2)


Поскольку в модели Author нет поля с именем books, вы не можете добавить его в поля AuthorCreateView.

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

Пример.

book_instance.authors.add(author_instance)
person kartikmaji    schedule 21.02.2017
comment
в каком методе? - person Tjorriemorrie; 26.03.2019
comment
Ну, это до того, что вы строите. - person kartikmaji; 26.03.2019

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

это мои формы.py

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

это мои взгляды.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())

Кстати, спасибо @kartikmaji, вы спасли мой день :)

person Luthfi    schedule 22.02.2017