Как на Django получить параметр из адресной строки через DetailView (get_context_data)?

Совсем недавно я начал изучать Django. У меня есть одна база данных (в будущем станет 2 отдельные таблицы). В 1-й таблице будет каталог жилищ, а на 2-й аренда жилищ. (Я не планирую хранить аренду в жилищах. В будущем мне понадобиться они по отдельности, а не вместе). На каждой странице жилья будет форма для оформления аренды жилья. При заполнении формы данные не должны приписываться ко всем жилищам, а к определённой записи, который выбрал пользователь. Я, пока, что временно не знаю, как решить эту проблему, но я придумал взять текущий идентификатор страницы от жилья, и отправить её вместе с формой в базу данных аренды жилья. Поэтому мне нужно получить идентификатор из текущей адресной строки на страницах отдельных жилищ для дальнейшей обработки. Я пытался решить эту проблему несколько дней разными способами. А так и не решил. Ошибка на ошибке. Пожалуйста, подскажите новичку напутствия решения этой проблемы. Заранее всех благодарю!

Появляются ошибка с get_context_data. Говорит, что не передал обязательный аргумент request. Но нужен ли он? И куда его писать? Я не понял. А также вечно появляется ошибка с аргументом {'pk': ''}'. Шаблон не помог - ['/id=(?P[0-9]+)/$'].

models.py

from django.db import models
from django.urls import reverse

from account.models import Account


class Building(models.Model):
    building_id = models.AutoField(verbose_name='ID Зданий', primary_key=True)
    landlord = models.OneToOneField(Account, to_field='account_id',  on_delete=models.CASCADE, verbose_name="ID Арендодателя", null=True, blank=True)
    author = models.CharField(verbose_name="Арендодатель", max_length=60, null=True, blank=True)
    image = models.ImageField(verbose_name="Фотография", upload_to="account/building/")
    title = models.CharField(verbose_name="Название", max_length=100)
    description = models.TextField(verbose_name="Описание", max_length=500)
    address = models.CharField(verbose_name="Адрес", max_length=100)
    priсe_per_day = models.PositiveIntegerField(verbose_name="Цена за сутки")
    date = models.DateField(verbose_name="Дата добавления здания", auto_now_add=True)
    rental = models.BooleanField(verbose_name="Аренда", default=False)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('building', kwargs={'pk': self.building_id})
    
    def get_description(self):
        return self.description [:100] + '...'


# class RentalBuilding(models.Model):
#     rental_id=building_id = models.AutoField(verbose_name='ID Аренда здания', primary_key=True)
#     tenant_id = models.PositiveIntegerField(verbose_name="ID Арендатора", null=True, blank=True)
#     buyer = models.CharField(verbose_name="Арендатор", max_length=60, null=True, blank=True)
#     start_date = models.DateTimeField(verbose_name="Начало даты", null=True, blank=True)
#     end_date = models.DateTimeField(verbose_name="Конец даты", null=True, blank=True)

urls.py (не в приложении, а проектная)

from django.contrib import admin
from django.urls import path

from django.conf.urls.static import static
from django.conf import settings

from directory.views import (
    BuildingsListView, 
    BuildingsDetailView,
    add_building,
)

urlpatterns = [
    path('', BuildingsListView.as_view(), name='directory'),
    path('id=<int:pk>/', BuildingsDetailView.as_view(), name='building'),
    path('add-building/', add_building, name='add_building'),
    path('admin/', admin.site.urls),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

views.py

from django.shortcuts import render
from django.contrib.auth import authenticate
from django.contrib.auth.decorators import login_required
from django.views.generic import ListView, DetailView,

from .forms import AddBuildingForm
from .models import Building

from account.models import Account, Tenant, Landlord

from django import template
register = template.Library()


@register.filter(name='rental_building')
def value_rental_building_equals(value):
    return value.split('=')


@register.filter(name='rental_building')
def value_rental_building_slash(value):
    return value.split('/')


# Смотреть каждое здание в каталоге
class BuildingsListView(ListView):
    model = Building
    template_name = 'directory/directory.html'


# Смотреть каждое здание постранично
class BuildingsDetailView(DetailView):
    model = Building
    context_object_name = 'directory'
    # extra_context = {'test_getting_id': building_rental()}
    template_name = 'directory/building.html'

    def building_rental(self, request):
        total_url_parameters_equls = value_rental_building_equals(request.path)
        total_url_parameters_slash = value_rental_building_slash(total_url_parameters_equls[-1])
        total_url_parameter_id = total_url_parameters_slash[-1]
        return total_url_parameters_slash[0]

    def get_context_data(self, request, *args, **kwargs):
        buil_ren = self.building_rental(request)
        context = super(BuildingsDetailView, self).get_context_data(request, *args, **kwargs)
        context["buil_ren"] = buil_ren
        return context


@login_required(login_url="login")
def add_building(request):
    context = {}

    if request.method == "POST":
    
        add_building_form = AddBuildingForm(request.POST, request.FILES)
        if add_building_form.is_valid():
        
            image = add_building_form.cleaned_data.get('image')
            title = add_building_form.cleaned_data.get('title')
            description = add_building_form.cleaned_data.get('description')
            address = add_building_form.cleaned_data.get('address')
            priсe_per_day = add_building_form.cleaned_data.get('priсe_per_day')

            add_building = Building.objects.create(
                landlord_id=request.user.account_id,#Account.objects.filter(landlord_id=request.user.account_id),
                author=f"{request.user.first_name} {request.user.last_name}",
                image=image,
                title=title,
                description=description,
                address=address,
                priсe_per_day=priсe_per_day,
            )

            add_building.save()

            # rental_building_id = RentalBuilding.objects.create(
            #     rental_id=building_id,
            # )

            # rental_building_id.save()

            return redirect("/")
    
        else:
            context["add_building_form"] = add_building_form

    else:
        add_building_form = AddBuildingForm()
        context["add_building_form"] = add_building_form

    return render(request, 'directory/add_building.html', context)
Вернуться на верх