[英]could someone explain why we return super().form_valid(form) in form_valid method in CreateView in django?
[英]'super' object has no attribute 'form_valid' (Django)
我認為我收到此錯誤的原因可能是因為我沒有在 detailView 中使用FormMixin
和 form_class。 我已經嘗試過了,但是我的表單在沒有current_class_pk
情況下無法運行(我使用kwargs.pop
在我的 AttendanceForm 中添加了它)所以我必須使用get_context_data
將get_context_data
的 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.