#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