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 = 'Участники групп АКП'