Использование request.session для заполнения формы django - PullRequest
0 голосов
/ 25 сентября 2018

Я хочу сохранить форму в сеансе, чтобы пользователю не приходилось повторно применять фильтры при переходе на другой URL-адрес.Вот ошибка, которую я получаю:

У объекта 'Unicode' нет атрибута 'get'

У меня есть такой код:

views.py

def someview(request):
  if request.method == 'POST':
    form = Form(request.POST, initial=request.session.get('save_form', None))

    if form.is_valid():
      clean_form = json.dumps(form.cleaned_data, indent=4, sort_keys=True, default=str)
      request.session['save_form'] = clean_form

    else:
      pass    
  else:
    form = Form()

forms.py

class Form(forms.Form):
  startdate = forms.DateField(
      label='Start date',
      initial= '2018-01-01', 
      widget=forms.TextInput(attrs={'class':'datepicker'})
  )
  enddate = forms.DateField(
    label='End date', 
    initial= datetime.date.today() - datetime.timedelta(days=1), 
    widget=forms.TextInput(attrs={'class':'datepicker'})
  )
  manager = forms.MultipleChoiceField(
      required=False,
      choices=managers,
      widget=forms.SelectMultiple(),
  )

Будучи новичком в Django, я не уверен, куда идти дальше.Я почти уверен, что ошибка в начальном аргументе.Но, печатая его, кажется, напечатать то, что я ожидал.

TIA

1 Ответ

0 голосов
/ 25 сентября 2018

Мое лучшее предположение заключается в том, что вы JSONfify значения формы (json.dumps(form.cleaned_data, ...)), но вы не де-JSONify его при перезагрузке из сеанса.

При чтении сеанса вам нужно сделать json.loads(...)в какой-то момент:

saved_form = json.loads(request.session.get('save_form', ''))

Значение по умолчанию '' может быть не лучшим, я не пробовал.Если это дает вам ошибку, вы можете попробовать заменить ее на {}.

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ:

Примечаниечто загрузка контента из сеанса, вероятно, должна выполняться в последней ветке else.Как правило, вы не хотите указывать начальное значение, когда пользователь отправляет данные, как в POST запросе:

def someview(request):
    if request.method == 'POST':
        form = Form(request.POST)

        if form.is_valid():
            clean_form = json.dumps(form.cleaned_data, default=str)
            request.session['save_form'] = clean_form
        else:
            pass
    else:
        saved_form = json.loads(request.session.get('save_form', ''))
        form = Form(initial=saved_form)

EDIT 2:

Как правило, то, что вы хотите сделать в представлении формы, часто очень похоже, и вы можете обнаружить, что повторяете тот же самый шаблон.К счастью, Django может помочь с этим, и он называется представлениями на основе классов, и я рекомендую ccbv.co.uk , если вы заинтересованы в этом, например, FormView .

Тем не менее, они могут быть немного запутанными, и вам трудно разобраться, когда вы только начинаете.Возможно, сейчас лучше придерживаться представлений на основе функций (как и вы), но я подумал, что связал эти 2 ресурса, которые мне хотелось бы иметь, когда я начал изучать представления на основе классов.

...