объект ‘super’ не имеет атрибута ‘form_valid’ (Django)

#python #django

#python #django

Вопрос:

Я думаю, что причина, по которой я получил эту ошибку, может быть, потому, что я не использовал FormMixin и form_class в DetailView. Я пробовал это, но моя форма не будет запускаться без current_class_pk (я добавил ее в свою форму посещаемости с помощью kwargs.pop ), поэтому я должен использовать get_context_data для передачи pk из detailview в форму.

Как я могу это исправить? или в любом случае есть другие способы передать detailview pk в form_class?

view.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)
  

forms.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'
  

Комментарии:

1. Пожалуйста, опубликуйте все сообщение об ошибке с обратной трассировкой…

2. УDetailView нет формы, FormView у них есть

3. @Sayse Внутри моего DetailView я хочу иметь другую форму, и эта форма использует модель, которая имеет manytomanyfield с другой моделью. Итак, я хочу отфильтровать manytomantfield с текущим идентификатором detailview.

4. Это нормально, но вам нужно использовать что-то с FormMixin или использовать mixin самостоятельно.

5. @Скажем, если я использую FormMixin, я не знаю, как передать pk из DetailView в форму. Знаете ли вы, как передать pk в форму внутри form_class?

Ответ №1:

Если я хочу использовать форму внутри 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