Ajax-запрос в django

Я пытаюсь использовать ajax запросы и перезагружать только tbody после того, как пользователь добавит или удалит строку. В html шаблоне у меня есть таблица и внутри тега script у меня есть функция для загрузки таблицы, удаления строки и добавления строки.

Мне нужно связать forms.py с html шаблоном, что я делаю не так?

Также невозможно удалить строку из таблицы, возможно ошибка из-за несоответствия значения в urls.py: 'url_to_django/delete-person/int:Id_Group', значению person.Id_Group, но я не знаю, как их связать.

Также информация в шаблоне html отображается неявно.

Я пытаюсь использовать решение, представленное на следующей странице https://stackoverflow.com/a/70352509/17641696, но я не смог понять, почему автор использует template2.

HTML

Views.py

    def load_table(request):
    error = ''
    id_incidents = request.session.get('Id_Incidents', 'ничего не передано')

    if request.method == "GET":
        if request.user:
            # if id_incidents:
            try:
                # persons = AkpGroup.objects.get(Id_Incidents=77)  # запрос в базу данных
                persons = AkpGroup.objects.filter(Id_Incidents=150)
            except AkpGroup.objects.DoesNotExist:
                persons = None

            # else:
            #     error = 'id_incidents не обнаружен'
            return render(request, 'main/group.html', {"persons": persons})
        else:
            return HttpResponse(status=403)
    else:
        return HttpResponse(status=405)


def delete_person(request, person):
    if request.method == "DELETE":
        if request.user:
            person_to_delete = AkpGroup.objects.filter(Id_Group=person.Id_Group)
            person_to_delete.delete()
            return HttpResponse(status=200)
        else:
            return HttpResponse(status=403)
    else:
        return HttpResponse(status=405)


def add_person(request):
    id_incidents = request.session.get('Id_Incidents', 'ничего не передано')
    if request.method == "POST":
        if request.user:
            form = AkpGroupForm(request.POST)  # форма, созданная в forms.py чтобы добавить участника
            if form.is_valid():
                # group_created = form['Group'].save(commit=False)
                # group_created.Id_Incidents = get_object_or_404(AkpIncidents, Id_Incidents=id_incidents)
                # group_created.save()
                Id_Incidents = form.cleaned_data['Id_Incidents']
                Id_People = form.cleaned_data['Id_People']
                Competencies = form.cleaned_data['Competencies']
                Type_Participation = form.cleaned_data['Type_Participation']
                new_person = AkpGroup(
                    Id_Incidents=Id_Incidents,
                    Id_People=Id_People,
                    Competencies=Competencies,
                    Type_Participation=Type_Participation,
                )
                new_person.save()
                return HttpResponse(status=201)
            else:
                return HttpResponse(status=400)
        else:
            return HttpResponse(status=403)
    else:
        return HttpResponse(status=405)

Urls.py

app_name = "main"

urlpatterns = [
    path('', views.start, name="start"),
    path('incident', views.incident, name="incident"),
    path('victim', views.victim, name="victim"),
    path('group', views.Groups.as_view(), name='group'),

    path('AdditionalDetail', views.additional_detail, name='AdditionalDetail'),
    path('events', views.events, name='events'),
    path('monitoring', views.monitoring, name='monitoring'),

    path(
        'url_to_django/delete-person/<int:Id_Group>',
        views.delete_person,
        name='delete_person'),
    path(
        'url_to_django/add-person/',
        views.add_person,
        name='add_person'),
    path(
        'url_to_django/load_table/',
        views.load_table,
        name='load_table')

]

Forms.py

class AkpGroupForm(ModelForm):
    required_css_class = 'required'

    class Meta:
        model = AkpGroup
        fields = ['Id_Incidents', 'Type_Participation', 'Id_People', 'Competencies']
        # exclude = ('Id_Incidents',)

        widgets = {
            "Id_Incidents": Select(attrs={
                'class': 'form-select'
            }),

            "Type_Participation": Select(attrs={
                'class': 'form-select',
                'style': 'height: 40px'
            }),

            "Id_People": Select(attrs={
                'class': 'form-select',
                'style': 'height: 40px'
            }),

            "Competencies": Textarea(attrs={
                'class': 'form-select',
                'style': 'height: 40px'
            })
        }


class AkpCheckResultForm(ModelForm):
    required_css_class = 'required'

    class Meta:
        model = AkpCheckResult
        fields = ['Id_Incidents', 'Inspector', 'Company', 'Post', 'Basis_Attraction', 'Check_Area']
        exclude = ('Id_Incidents',)

        widgets = {
            "Id_Incidents": Select(attrs={
                'class': 'form-select'
            }),

            "Inspector": Select(attrs={
                'class': 'form-select',
                'style': 'height: 60px'
            }),

            "Company": Textarea(attrs={
                'class': 'form-select',
                'style': 'height: 60px'
            }),

            "Post": Textarea(attrs={
                'class': 'form-select',
                'style': 'height: 60px'
            }),

            "Basis_Attraction": Textarea(attrs={
                'class': 'form-select',
                'style': 'height: 60px'
            }),

            "Check_Area": Textarea(attrs={
                'class': 'form-select',
                'style': 'height: 60px'
            })
        }


class AkpMeetingForm(ModelForm):
    required_css_class = 'required'

    class Meta:
        model = AkpMeeting
        fields = ['Id_Incidents', 'Date_Time', 'Location', 'Responsible']
        exclude = ('Id_Incidents',)

        widgets = {
            "Id_Incidents": Select(attrs={
                'class': 'form-select'
            }),

            "Date_Time": DateTimeInput(attrs={
                'class': 'form-control',
                'type': 'Date'
            }),

            "Location": TextInput(attrs={
                'class': 'form-select',
                'style': 'height: 40px'
            }),

            "Responsible": TextInput(attrs={
                'class': 'form-select'
            })
        }

Models.py

class AkpGroup(models.Model):
    Id_Group = models.AutoField(primary_key=True, verbose_name='Идентификатор участника группы АКП')
    Id_Incidents = models.ForeignKey('AkpIncidents', models.DO_NOTHING, verbose_name='Идентификатор инцидента')
    # stage 3 fields
    Id_People = models.ManyToManyField('AkpPeople', verbose_name='Ф.И.О. участника')
    Competencies = models.CharField(max_length=256, verbose_name='Компетенции')

    LOAN_TYPE_PARTICIPATION = (
        ('d', 'Руководитель группы'),
        ('p', 'Член группы')
    )
    Type_Participation = models.CharField(max_length=1, choices=LOAN_TYPE_PARTICIPATION, default='p',
                                          verbose_name='Тип участия')
    # Вспомогательные
    Change_Time = models.DateTimeField(auto_now=True, blank=True, null=True, verbose_name='Время изменения')
    Change_User = models.CharField(max_length=256, verbose_name='Пользователь, внесший изменения')
    Del_Date = models.DateTimeField(auto_now=False, blank=True, null=True, verbose_name='Дата удаления')
    Del_User = models.CharField(max_length=256, verbose_name='Пользователь, удаливший данные')
    Is_Delete = models.BooleanField(default=False, verbose_name='Удален')

    Is_Posted = models.BooleanField(default=False, verbose_name='Опублековано')

    objects = models.Manager()

    def display_id_people(self):
        """
        Creates a string for the Genre. This is required to display genre in Admin.
        """
        return ', '.join([Id_People.Name for Id_People in self.Id_People.all()[:10]])
    display_id_people.short_description = 'AkpGroup'

    def __str__(self):
        return self.Competencies

    class Meta:
        db_table = 'Akp_Group'
        verbose_name = 'Группа АКП'
        verbose_name_plural = 'Группы АКП'

class AkpPeople(models.Model):
    Id_People = models.AutoField(primary_key=True, verbose_name='Идентификатор участника группы АКП')
    Name = models.CharField(max_length=256, verbose_name='Ф.И.О.')
    Post = models.CharField(max_length=256, verbose_name='Должность:')

    # class People:
    #     def __init__(self, Name, Post):
    #         self.Name = Name
    #         self.Post = Post

    def __str__(self):
        # return self.Name
    #     return f'{self.Name} {self.Post}'
        return '%s (%s)' % (self.Name, self.Post)

    # def getName(self):
    #     return self.Name, self.Post

    class Meta:
        db_table = 'akp_people'
        verbose_name = 'Участник группы АКП'
        verbose_name_plural = 'Участники групп АКП'
Вернуться на верх