Как на 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)