2015-09-25 3 views
3

This вопросы адресуют мой вопрос по фамилии, но я ищу более конкретное объяснение.Как передавать данные между представлениями django

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

В моем первом представлении представлен список всех «проектов» (одна из моих моделей) и извлекается идентификатор выбранного проекта.

Вот форма:

class ProjectLookupForm(forms.Form): 
    Project_Name = chosenforms.ChosenModelChoiceField(queryset=Project.objects.all()) 

и вот вид:

def update_project_filter(request): 
    project_form = ProjectLookupForm(request.POST or None) 
    if request.method == 'POST': 
     if project_form.is_valid(): 
      context = {"project_form":project_form} 
      # Get project here and share it with the next view. 
      selected_project_id = project_form.cleaned_data["Project_Name"].id 
      # Add a new return statement here? 
      # Or call update project view from here? 
      # Add a redirect button to html? 
     else: 
      errors = project_form.errors 
      context = {"errors":errors, "project_form":project_form} 
    else: 
     context = {"project_form":project_form} 
    return render(request, 'filter_update_project_form.html', context) 

Как можно видеть, я включил некоторые комментарии мозговой атаки, каковы мои возможности. Моя цель - отправить выбранный_project_id на это следующее представление, чтобы он мог использовать этот идентификатор в качестве набора запросов модели.

def update_project(request): 
    UpdateFormset = modelformset_factory(Sample, fields=("sample_name", "extraction_date", 
                "project", "order", "notebook", "notebook_page")) 
    if request.method == 'POST': 
     formset = UpdateFormset(request.POST, request.FILES) 
     if formset.is_valid(): 
      formset.save() 
      context = {"formset": formset, "project_form":project_form} 
     else: 
      errors = formset.errors 
      context = {"formset":formset, "errors":errors, "project_form":project_form} 
    else: 
     formset = UpdateFormset(queryset=Sample.objects.filter(project=2)) 
     context = {"formset":formset, "project_form":project_form} 
    return render(request, 'update_project_form.html', context) 

Здесь можно увидеть, что я жестко закодировал QuerySet так:

queryset=Sample.objects.filter(project=2) 

Как я могу установить «проект =» на мой selected_project_id? Я передаю эту информацию в представление в качестве входного параметра? Или отправить его на следующий URL-адрес и взять его оттуда?

+0

Извините, что самая первая ссылка сейчас фактически ссылается на что-то значимое. – Malonge

ответ

8

Предполагая, что вы активировали django.contrib.sessions.middleware.SessionMiddleware; вы можете передавать данные между видами с помощью словаря request.session следующим образом:

def update_project_filter(request): 
    ... 
    selected_project_id = project_form.cleaned_data["Project_Name"].id 
    request.session['selected_project_id'] = selected_project_id 
    ... 

def update_project(request): 
    ... 
    selected_project_id = request.session.get('selected_project_id') 
    ... 
+0

Ничего себе, это похоже на простое решение! Я попробую это поблагодарить вас! – Malonge

+0

Должны ли какие-либо библиотеки импортироваться для использования сеансов? –

+1

@ VishnuYS nope. – ozgur

Смежные вопросы