Использование данных URL для заполнения формы в Django с помощью представлений на основе классов
У меня есть 2 модели: Projects и Members, каждая из которых имеет форму. Я смог добавить в URL номер проекта (id) следующим образом:
class PageCreate(CreateView):
model = Page
form_class = PageForm
success_url = reverse_lazy('members:create')
def get_success_url(self):
return reverse_lazy('members:create', args=[self.object.id])
Когда я заканчиваю заполнять форму Проект, она перенаправляет страницу на форму Члена.
Я хочу извлечь ID проекта из URL и использовать его в форме Member. Я не могу придумать другого решения.
В настоящее время у меня есть список выбора для выбора Проекта в форме Члена, но я хочу, чтобы проект загружался сразу после создания.
Я использую CreateView в моделях для проектов и членов. Это представление для MemberCreate
@method_decorator(login_required, name='dispatch')
class MemberCreate(CreateView):
model = Member
form_class = MemberForm
success_url = reverse_lazy('pages:pages')
Единственная попытка визуализировать ID в HTML была с помощью
{{ request.get }}
Чтобы как-то получить значение из GET, но я не смог этого сделать.
Параметры URL
import imp
from django.urls import path
from .views import PageListView, PageDetailView, PageCreate, PageUpdate, PageDelete, MemberCreate, MemberDelete, MemberUpdate
pages_patterns = ([
path('', PageListView.as_view(), name='pages'),
path('<int:pk>/<slug:slug>/', PageDetailView.as_view(), name='page'),
path('create/', PageCreate.as_view(), name='create'),
path('update/<int:pk>', PageUpdate.as_view(), name='update'),
path('delete/<int:pk>', PageDelete.as_view(), name='delete'),
], 'pages')
members_patterns = ([
path('create/<int:pk>', MemberCreate.as_view(), name='create'),
path('update/<int:pk>', MemberUpdate.as_view(), name='update'),
path('delete/<int:pk>', MemberDelete.as_view(), name='delete'),
], 'members')
Разбор URL завершается в self.kwargs представлении. From
return reverse_lazy('members:create', args=[self.object.id])
вы передаете URL, например
path( 'create/<int:project>', MemberCreateView.as_view(), name='create' )
, а в представлении id теперь self.kwargs['project']. (обратите внимание, URL может указывать несколько именованных переменных, разделенных косой чертой, и не ограничивается только одной). Обычно затем используется
project = Project.objects.get( pk = self.kwargs['project'] )
Request.GET - это нечто иное: именно туда отправляется диктант, закодированный как строка запроса. Если ваш клиент предоставляет
http://server/app/foo?bar=27&baz=hello
тогда, когда вы придете в представление, которое обрабатывает app/foo, request.GET содержит
{ 'bar':'27', 'baz':'hello' }
(на самом деле это QueryDict, а не Python dict, что имеет некоторые тонкие различия. Обратитесь к документации Django. Главное отличие в том, что значения, прикрепленные к ключам, могут быть многозначными, для строки запроса типа ?bar=27&bar=54&bar=silly