python - “超级”对象没有属性“form_valid”(Django)
问题描述
我认为我得到这个错误的原因可能是因为我没有FormMixin
在 detailView 中使用 and form_class。我已经尝试过了,但是没有我的表单将无法运行current_class_pk
(我使用 将它添加到我的 AttendanceForm 中kwargs.pop
)所以我必须使用get_context_data
将 detailview 的 pk 传递给表单。
我怎样才能解决这个问题?或者还有其他方法可以将detailview pk 传递给form_class?
视图.py
class Class_detailView(LoginRequiredMixin, DetailView):
login_url = '/'
model = Class
template_name = "attendance/content/teacher/class_detail.html"
def get_context_data(self, **kwargs):
class_pk = self.object.pk
print(class_pk)
context = super(Class_detailView, self).get_context_data(**kwargs)
context['attendance_form'] = AttendanceForm(current_class_pk=class_pk) # pass data to form via kwargs
return context
def get_success_url(self):
return reverse('class_detail', kwargs={'pk': self.object.pk})
def post(self, request, *args, **kwargs):
self.object = self.get_object()
if request.method == "POST":
attendance_form = AttendanceForm(request.POST, current_class_pk=self.kwargs.get('pk'))
if attendance_form.is_valid():
return self.form_valid(attendance_form)
def form_valid(self, form):
form.instance.teacher = self.request.user
form.instance.attendance_class = self.object
form.save()
return super(Class_detailView, self).form_valid(form)
表格.py
class AttendanceForm(forms.ModelForm):
class Meta:
model = Attendance
fields = ['student',]
def __init__(self, *args, **kwargs):
current_class_pk = kwargs.pop('current_class_pk')
super(AttendanceForm, self).__init__(*args, **kwargs)
current_student = Class.objects.get(id=current_class_pk)
self.fields['student'].queryset = current_student.student
我得到的错误
Traceback (most recent call last):
File "/Users/muongkimhong/Developments/annexar-attendance/env/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/Users/muongkimhong/Developments/annexar-attendance/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 "/Users/muongkimhong/Developments/annexar-attendance/env/lib/python3.8/site-packages/django/views/generic/base.py", line 73, in view
return self.dispatch(request, *args, **kwargs)
File "/Users/muongkimhong/Developments/annexar-attendance/env/lib/python3.8/site-packages/django/utils/decorators.py", line 43, in _wrapper
return bound_method(*args, **kwargs)
File "/Users/muongkimhong/Developments/annexar-attendance/env/lib/python3.8/site-packages/django/contrib/auth/decorators.py", line 21, in _wrapped_view
return view_func(request, *args, **kwargs)
File "/Users/muongkimhong/Developments/annexar-attendance/env/lib/python3.8/site-packages/django/contrib/auth/mixins.py", line 52, in dispatch
return super().dispatch(request, *args, **kwargs)
File "/Users/muongkimhong/Developments/annexar-attendance/env/lib/python3.8/site-packages/django/views/generic/base.py", line 101, in dispatch
return handler(request, *args, **kwargs)
File "/Users/muongkimhong/Developments/annexar-attendance/annexar-attendance/attendance/views.py", line 199, in post
return self.form_valid(attendance_form)
File "/Users/muongkimhong/Developments/annexar-attendance/annexar-attendance/attendance/views.py", line 205, in form_valid
return super(Class_detailView, self).form_valid(form)
AttributeError: 'super' object has no attribute 'form_valid'
解决方案
如果我想在 DetailView 中使用表单,我真的需要拥有FormMixin
并设置 form_class。所以我通过覆盖get_form_kwargs
方法修复它并get_context_data
从视图中删除。
def get_form_kwargs(self):
kwargs = super(Class_detailView, self).get_form_kwargs()
kwargs['class_pk'] = self.kwargs.get('pk')
return kwarg
在里面forms.py
我需要做的就是将 传递给class_pk
构造函数参数。
def __init__(self, class_pk, *args, **kwargs):
super(AttendanceForm, self).__init__(*args, **kwargs)
current_student = Class.objects.get(id=class_pk)
self.fields['student'].queryset = current_student.student
推荐阅读
- matlab - 如何矢量化以下计算?
- django - 即使在用户登录 Django 后,应用程序仍显示登录页面
- java - 具有依赖项的 Maven 可执行 JAR
- node.js - 在 NestJS 中重定向或渲染 UI
- python-3.x - 通过在 python 3 中导入 libm 来改变舍入模式
- html - 使这些列等高
- ansible - 如何使用 ansible.builtin.template 模块在文件中写入变量值?
- python - 如何使用 re.sub 匹配和替换模式的未定义数字
- format - as.POSIXct 有时无法转换
- javascript - 显示来自 MongoDB 的结果