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