Как я могу передать идентификатор через представления функций и CBV? - Джанго - PullRequest
0 голосов
/ 29 сентября 2019

Извините за такой вопрос новичка, но я застрял и протягиваю руку. Я использовал FormWizard для сбора данных подписки от пользователей. Работает отлично. Теперь я хочу, чтобы они могли обновлять подписку, используя тот же FormWizard.

Я могу показать их предыдущие входные данные, однако, когда дело доходит до фактического знания, какую запись обновить, вот где у меня возникают проблемы. Я могу получить id из URL в функции представления для этого пути, но у меня возникают проблемы с получением id для других представлений.

Мой код указан ниже. Я застрял в разделе 9.3. Я не уверен, как получить запись id, чтобы она могла обновить правильную запись. Если есть лучший подход, не стесняйтесь предложить его и спасибо заранее.

urls.py

path('subscription/update/<int:id>/', service_views.wizard_edit, name='wizard-edit'),

views.py

## 9.1 Displaying the data in the form
def wizard_edit(request, id):

    ##  Collecting the data
    sub = Subscribers.objects.get(id=id)

    ## Displaying the data in the appropriate forms
    initial = {
       '0': {'industry_search':sub.industry},
       '1': {'city':sub.city, 'kilometers':sub.kilometers, 'street_1':sub.street_1, 'street_2':sub.street_2},
       '2': {'email':sub.email}
       }

    wiz = ContactWizardUpdate.as_view([ContactForm1, ContactForm2, ContactForm3], initial_dict=initial)
    return wiz(request)

## 9.2 FormWizard
class ContactWizardUpdate(SessionWizardView):
    template_name = 'service/subscribe.html'
    form_list = [ContactForm1, ContactForm2, ContactForm3]

    def done(self, form_list, **kwargs):

        ## Function to update the DB and save data
        update_the_form_data(self, form_list)

        return render(self.request, 'service/done.html')

## 9.3 Updating the database with the changes
def update_the_form_data(self, form_list):
    form_data = [form.cleaned_data for form in form_list]

    ## Get the correct record for the update
    foo = get_object_or_404(Subscribers, id=[THE ID FOR THE RECORD])

    ## Additional code

    foo.save()

1 Ответ

0 голосов
/ 29 сентября 2019

Я нашел способ сделать это. Я поделюсь, если это поможет кому-то еще.

Вместо указания пути в файле urls.py: path('subscription/update/<int:id>/', service_views.wizard_edit, name='wizard-edit'),

Я изменил его на path('subscription/update/', service_views.wizard_edit, name='wizard-edit'), и добавил кнопку редактирования на странице сводки подписки пользователя со следующим путем, <a href="DOMAIN.COM/subscription/update/?id={{ detail.id }}">Edit Subscription</a>

Вот изменения в файле views.py:

## 9.1 Displaying the data in the form
def wizard_edit(request):  ## NEW
    id_ = request.GET.get('id')  ## NEW

    ##  Collecting the data
    sub = Subscribers.objects.get(id=id_)  ## NEW

    ## Displaying the data in the appropriate forms
    initial = {
       '0': {'industry_search':sub.industry},
       '1': {'city':sub.city, 'kilometers':sub.kilometers, 'street_1':sub.street_1, 'street_2':sub.street_2},
       '2': {'email':sub.email}
       }

    wiz = ContactWizardUpdate.as_view([ContactForm1, ContactForm2, ContactForm3], initial_dict=initial)
    return wiz(request)

## 9.2 FormWizard
class ContactWizardUpdate(SessionWizardView):
    template_name = 'service/subscribe.html'
    form_list = [ContactForm1, ContactForm2, ContactForm3]

    def done(self, form_list, **kwargs):

        ## Function to update the DB and save data
        update_the_form_data(self, form_list)

        return render(self.request, 'service/done.html')

## 9.3 Updating the database with the changes
def update_the_form_data(self, form_list):
    form_data = [form.cleaned_data for form in form_list]

    id_ = self.request.GET.get('id') ## NEW
    ## Get the correct record for the update
    foo = get_object_or_404(Subscribers, id=id_)  ## NEW

    ## Additional code

    foo.save()
...