如何更新Django表单中的ManyToManyField子属性?

如何更新Django表单中的ManyToManyField子属性?,django,django-models,django-forms,django-views,Django,Django Models,Django Forms,Django Views,我有两张表格。我想更新一本书的书名和课程名称,这也是一本书的内容。当我点击一本书的更新url时,我发现“ManyRelatedManager”对象没有属性“\u meta”,出现了这个错误。你能告诉我如何解决这个问题吗? 这是错误的回溯 Traceback(most recent call last): File "/home/project/NLS/env/lib/python3.8/site-packages/django/core/handlers/exception.py&

我有两张表格。我想更新一本书的书名和课程名称,这也是一本书的内容。当我点击一本书的更新url时,我发现“ManyRelatedManager”对象没有属性“\u meta”,出现了这个错误。你能告诉我如何解决这个问题吗? 这是错误的回溯

Traceback(most recent call last):
  File "/home/project/NLS/env/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
  response = get_response(request)
  File "/home/project/NLS/env/lib/python3.8/site-packages/django/core/handlers/base.py", line 179, in _get_response
  response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/project/NLS/src/report/views.py", line 54, in book_update_form
  lession_form = LessonForm(instance=book.lesson)
  File "/home/project/NLS/env/lib/python3.8/site-packages/django/forms/models.py", line 294, in __init__
  object_data = model_to_dict(instance, opts.fields, opts.exclude)
  File "/home/project/NLS/env/lib/python3.8/site-packages/django/forms/models.py", line 85, in model_to_dict
  opts = instance._meta

Exception Type: AttributeError at / report/genrate/1/
Exception Value: 'ManyRelatedManager' object has no attribute '_meta'
models.py

class Lesson(models.Model):
    name = models.CharField(max_length=10)
    created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name


class Book(models.Model):
    title = models.CharField(max_length=10)
    created = models.DateTimeField(auto_now_add=True)
    lesson = models.ManyToManyField(Lesson)

    def __str__(self):
        return self.title
forms.py

class BookForm(forms.ModelForm):
    class Meta:
        model = Book
        fields = ['title', 'lesson']


class LessonForm(forms.ModelForm):
    name = forms.CharField(max_length=10)

    class Meta:
        model = Lesson
        fields = ['name']
views.py

def book_update_form(request, pk):
    book = get_object_or_404(Book, pk=pk)
    b_form = BookForm(request.POST, instance=book)
    l_form = [LessonForm(request.POST, prefix=str(
        lesson.pk), instance=lesson) for lesson in book.lesson.all()]

    if b_form.is_valid() and all([lf.is_valid() for lf in v_form]):
        book_update = b_form.save(commit=False)
        book_update.save()
        for lf in l_form:
            lesson_form = lf.save(commit=False)
            lesson_form.book = book_update
            lesson_form.save()
        return redirect('dashboard')
    else:
        book_update = BookForm(instance=book)
        lession_form = LessonForm(instance=book.lesson)
    context = {
        'book_update': book_update,
        'lesson_form': lesson_form
    }
    return render(request, 'update.html', context)
  • 您在
    [lf.is\u valid()for lf in v\u form]
    中出错<代码>v_表单未定义,您可能希望使用l_表单

  • lesson\u form.book=book\u update
    <代码>课程模型没有书本属性,因此不需要此行

  • 在您的
    else
    案例中,您创建了
    lession\u form=LessonForm(instance=book.lesson)
    。book.lesson是
    ManyToManyField
    ,所以这里也有错误。 我将以这种方式重构您的代码:


  • 您在book.lesson.all()中的课的
    中有错误。
    。lesson是一个外键,因此它只包含一个元素。如果你想在一本书中有很多课,那么使用
    ManyToManyField
    亲爱的,我也使用
    ManyToManyField
    那么我得到了
    \u meta
    错误。我可以用
    ManyToManyField
    更新我的问题吗?更新它并显示错误消息。更新后的问题请看一看亲爱的,你能解释一下如何在html模板中使用
    lesson\u form
    ?我像这样使用
    {{lesson_form}}
    并且我在html中得到了这个
    []
    。。。
    def book_update_form(request, pk):
        book = get_object_or_404(Book, pk=pk)
        b_form = BookForm(request.POST or None, instance=book)
        l_form = [LessonForm(request.POST or None, prefix=str(
            lesson.pk), instance=lesson) for lesson in book.lesson.all()]
    
        if request.POST and b_form.is_valid() and all([lf.is_valid() for lf in l_form]):
            b_form.save()
            for lf in l_form:
                lesson_form = lf.save()
            return redirect('dashboard')
        context = {
            'book_update': b_form,
            'lesson_form': l_form# it's better to rename this variable to lesson_form_list
        }
        return render(request, 'update.html', context)