Получить AutoField id только что созданной записи в модели, при условии описании полей в forms.py
Я только начинаю изучать django, подскажите, пожалуйста: мне нужно получить id только что созданной записи в модели, проблема в том, что я не знаю как его объявить. Так как id записи является Auto Field, id не передается в forms.py, а создается/остается в базе данных после создания записи. Если бы я не использовал функционал forms.py, я бы сумел получить этот идентификатор, аналогично примеру из документации (https://docs.djangoproject.com/en/dev/ref/models/instances/?from=olddocs#auto-incrementing-primary-keys):
Auto-incrementing primary keys Если модель имеет AutoField — первичный ключ с автоматическим увеличением — то это автоматически увеличенное значение будет вычислено и сохранено в качестве атрибута объекта при первом вызове:save()
b2 = Blog(name='Cheddar Talk', tagline='Thoughts on cheese.')
b2.id # Returns None, because b2 doesn't have an ID yet.
b2.save()
b2.id # Returns the ID of your new object.
Невозможно определить, каким будет значение идентификатора перед вызовом, потому что это значение вычисляется вашей базой данных, а не Django.save() Для удобства каждая модель имеет AutoField с именем по умолчанию, если явно не указано поле в модели. Дополнительные сведения см. в документации по AutoField. idprimary_key=True
но в моем случае я запутался, как правильно его объявить.
views.py
def incident(request):
error = ''
if request.method == 'POST' and 'next' in request.POST:
form = AkpIncidentsForm(request.POST)
if form.is_valid():
form.save()
# Неизвестный Id_Incidents:
request.session['Id_Incidents'] = Id_Incidents
return redirect('main:victim')
else:
error = 'The form is filled out incorrectly'
form = AkpIncidentsForm()
data = {
'form': form,
'error': error,
}
models.py
class AkpIncidents(models.Model):
Id_Incidents = models.AutoField(primary_key=True, verbose_name='Идентификатор инцидента')
Date_Time = models.DateTimeField(auto_now=False, blank=True, null=True, verbose_name='Дата/время происшествия')
# stage 1 fields
Date = models.DateField(auto_now=False, blank=True, null=True, verbose_name='Дата происшествия')
Time = models.TimeField(auto_now=False, blank=True, null=True, verbose_name='Время происшествия')
Id_Filial = models.ForeignKey('AkpFilial', models.DO_NOTHING, verbose_name='Филиал')
Id_Department = models.ForeignKey('AkpDepartment', models.DO_NOTHING, verbose_name='Подразделение')
Location = models.CharField(max_length=256, verbose_name='Место происшествия')
Id_Category = models.ForeignKey('AkpCategory', models.DO_NOTHING, verbose_name='Категория происшествия')
Execution_Works = models.TextField(verbose_name='Выполнение работ по')
Short_Description = models.TextField(verbose_name='Краткое описание происшествия:')
Full_Description = models.TextField(verbose_name='Полное описание происшествия:')
# Вспомогательные
Change_Time = models.DateTimeField(auto_now=True, blank=True, null=True, verbose_name='Время изменения')
Change_User = models.CharField(max_length=256, blank=True, null=True, verbose_name='Пользователь, внесший изменения')
Del_Date = models.DateTimeField(auto_now=False, blank=True, null=True, verbose_name='Дата удаления')
Del_User = models.CharField(max_length=256, blank=True, null=True, verbose_name='Пользователь, удаливший данные')
Is_Delete = models.BooleanField(default=False, blank=True, null=True, verbose_name='Удален')
Is_Posted = models.BooleanField(default=False, verbose_name='Опублековано')
objects = models.Manager()
def get_absolute_url(self):
"""
Возвращает URL-адрес для доступа к определенному экземпляру инцидентов.
"""
return reverse('Incident-detail', args=[str(self.Id_Incidents)])
def __str__(self):
return self.Short_Description
class Meta:
db_table = 'AkpIncidents'
verbose_name = 'Инцидент'
verbose_name_plural = 'Инциденты'
return render(request, 'main/incident.html', data)
forms.py
class AkpIncidentsForm(ModelForm):
required_css_class = 'required'
class Meta:
model = AkpIncidents
fields = ['Id_Incidents', 'Date', 'Time', 'Id_Filial', 'Id_Department', 'Location', 'Id_Category',
'Execution_Works', 'Short_Description', 'Full_Description']
widgets = {
# "Id_Incidents": Textarea(attrs={
# 'class': 'form-control',
# 'placeholder': 'Id_Incidents',
# }),
"Date": DateInput(attrs={
'class': 'form-control',
'type': 'Date'
}),
"Time": TimeInput(attrs={
'class': 'form-control',
'type': 'Time'
}),
"Id_Filial": Select(attrs={
'class': 'form-select'
}),
"Id_Department": Select(attrs={
'class': 'form-select'
}),
"Location": Textarea(attrs={
'class': 'form-control',
'placeholder': 'Укажите место происшествия',
'style': 'height: 100px'
}),
......
incident.html .....
{% for field in form.visible_fields %}
<table class='table align-middle table-borderless event-tab' width="100%">
<tbody>
<tr>
<td class="first">{{ field.label }}</td>
<td class="second">{{ field }}</td>
</tr>
</tbody>
</table>
{% endfor %}
......
urls.py
from django.urls import path
# from .views import GroupListView
from .import views
from .views import AkpVictimView, events
from django.views.generic import RedirectView
from django.urls import path, include, reverse_lazy
app_name = "main"
urlpatterns = [
path('', views.start, name="start"),
path('incident', views.incident, name="incident"),
path('victim', views.victim, name="victim"),
....