Django ManyToMany CreateView Fields In Both Tables

梦想与她 提交于 2019-12-12 05:48:26

问题


I have two models, there are Book and Author and I add ManyToMany field inside Book model

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)

If I want to create CreateView from book and access authors, I can just add code like this

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

but something that I want to ask is I want to create CreateView from Author model and add field named books inside it. I tried to code like this

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

and it shows an error "Unknown field(s) (books) specified for Author".

help me masters, I'm new in django

Thanks :)


回答1:


Since Author model don't have a field named books, you cannot add that in AuthorCreateView fields.

What you should do is first create an instance of Author and then add them as author in books instance.

Example.

book_instance.authors.add(author_instance)



回答2:


Now, it is solved by using Form and FormView, this is my code

this is my forms.py

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

this is my 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 thanks @kartikmaji , you have saved my day :)



来源:https://stackoverflow.com/questions/42379714/django-manytomany-createview-fields-in-both-tables

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!