получить идентификатор из URL в классе в Джанго - PullRequest
0 голосов
/ 04 марта 2019

Я хочу получить идентификатор из URL, чтобы я мог использовать набор запросов в diff.Методы класса.но он показывает:

schedule = get_object_or_404(Schedule, id=kwargs['pk'])
NameError: name 'kwargs' is not defined

Вот мой код:

class SubmitAttendanceView(View):
template_name = 'schedule/submit_attendance.html'  # this html file will be included in 'schedule/scheduledetail.html'
form_class = AttendanceForm
schedule = get_object_or_404(Schedule, id=kwargs['pk'])
students = Student.objects.filter(course__id__in=schedule.course.all(), sem=schedule.sem, subject__id__contains=schedule.subject.id).order_by('roll_no')

def get(self, request, pk):
    form = self.form_class()
    return render(request, self.template_name, {'form': form, 'students': self.students})

def post(self, request, *args, **kwargs):
    form = self.form_class(request.POST)
    if form.is_valid():
        date = form.cleaned_data['lecture_date']
        lecture = self.schedule.id
        subject = self.schedule.subject.id
        x = 1  # a counter to fetch each checkbox from template by their name
        for student in self.students:
            course = Course.objects.get(id=student.course.id)
            mark = self.request.POST[f'mark{x}']
            if not mark:
                mark = 0
            attendance = Attendance(lecture=lecture, subject=subject, course=course, student=student, lecture_date=date, mark=mark)
            attendance.save()
            x += 1
            return redirect('schedule')
    return render(request, self.template_name, {'form': form, 'students': students})

urls.py:

 path('<int:pk>/submit/', SubmitAttendanceView.as_view(), name='submit-attendance')

в шаблоне:

<a class="btn btn-md btn-danger add-new my-2" type="button" href="{% url 'submit-attendance' schedule.pk %}">Submit Attendance</a>

также скажите, есть ли другой способ, которым я могу передать набор запросов в переменную и использовать его в моих методах класса

Решено:

class SubmitAttendanceView(View):
    template_name = 'schedule/submit_attendance.html'  # this html file will be included in 'schedule/scheduledetail.html'
    form_class = AttendanceForm
 def get_schedule(self, value):
    return get_object_or_404(Schedule, id=value)

 def get_students(self, value):
    schedule = self.get_schedule(value)
    # specify Students queryset
    students_queryset = Student.objects.filter(course__id__in=schedule.course.all(), sem=schedule.sem, subject__id__contains=schedule.subject.id).order_by('roll_no')
    return students_queryset

 def get(self, request, **kwargs):
    form = self.form_class()
    students = self.get_students(kwargs['pk'])
    return render(request, self.template_name, {'form': form, 'students': students})

 def post(self, request, *args, **kwargs):
    form = self.form_class(request.POST)
    if form.is_valid():
        date = form.cleaned_data['lecture_date']
        schedule = self.get_schedule(kwargs['pk'])
        lecture = Schedule.objects.get(id=schedule.id)
        subject = Subject.objects.get(id=schedule.subject.id)
        x = 1  # a counter to fetch each checkbox from template by their name
        students = self.get_students(kwargs['pk'])
        for student in students:
            course = Course.objects.get(id=student.course.id)
            mark = self.request.POST.get(f'mark{x}')
            if not mark:
                mark = 0
            attendance = Attendance(lecture=lecture, subject=subject, course=course, student=student, lecture_date=date, mark=mark)
            attendance.save()
            x += 1
        return redirect('schedule')
    return render(request, self.template_name, {'form': form, 'students': students})

После выполнения вышеуказанногоИзменения в коде, работает нормально

1 Ответ

0 голосов
/ 04 марта 2019

Вы не можете использовать kwargs в атрибуте класса, потому что это аргумент ключевого слова, который был передан вашему представлению.Вы можете использовать его только в представлении.

class SubmitAttendanceView(View):
    template_name = 'schedule/submit_attendance.html'  # this html file will be included in 'schedule/scheduledetail.html'
    form_class = AttendanceForm

    def get_schedule(self, **kwargs):
        return get_object_or_404(Schedule, id=kwargs['pk'])

    def get_students(self, **kwargs):
        schedule = self.get_schedule(kwargs)
        # specify Students queryset
        students_queryset = Student.objects.filter(...)
        return students_queryset

    def get(self, request, **kwargs):
        form = self.form_class()
        students = self.get_students(kwargs)
        return render(request, self.template_name, {'form': form, 'students': students})

    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST)
        if form.is_valid():
            date = form.cleaned_data['lecture_date']
            schedule = self.get_schedule(kwargs)
            lecture = schedule.id
            subject = schedule.subject.id
            x = 1  # a counter to fetch each checkbox from template by their name
            students = self.get_students(kwargs)
            for student in self.students:
                course = Course.objects.get(id=student.course.id)
                mark = self.request.POST[f'mark{x}']
                if not mark:
                    mark = 0
                attendance = Attendance(lecture=lecture, subject=subject, course=course, student=student, lecture_date=date, mark=mark)
                attendance.save()
                x += 1
                return redirect('schedule')
        return render(request, self.template_name, {'form': form, 'students': students})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...