簡體   English   中英

“超級”對象沒有屬性“form_valid”(Django)

[英]'super' object has no attribute 'form_valid' (Django)

我認為我收到此錯誤的原因可能是因為我沒有在 detailView 中使用FormMixin和 form_class。 我已經嘗試過了,但是我的表單在沒有current_class_pk情況下無法運行(我使用kwargs.pop在我的 AttendanceForm 中添加了它)所以我必須使用get_context_dataget_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM