使用request.session填充Django表单

时间:2018-09-25 16:56:17

标签: python django django-views

我想在会话中保存表单,以便用户在转到其他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 :(得分:0)

我最好的猜测是,您对表单值(json.dumps(form.cleaned_data, ...))进行了JSONfify,但是从会话中重新加载时,您并未对它进行JSONfify。

阅读会话时,您需要在某个时候进行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)

编辑2:

通常,您想要在表单视图中执行的操作通常非常相似,并且您可能会发现自己重复了相同的样板。幸运的是,Django在这方面有帮助,它称为基于类的视图,如果您有兴趣深入研究,建议使用ccbv.co.uk,例如FormView

但是,当您刚开始学习时,它们可能会有些混乱并且很难引起您的注意。也许现在最好还是坚持使用基于函数的视图,但是我想我已经链接到我希望在开始学习基于类的视图时拥有的这两个资源。