Django: Menyimpan dan memulihkan keadaan formulir menggunakan cookie

Saya ingin membuat formulir yang setelah dikirimkan, pada setiap rendering formulir berikutnya untuk pengguna yang sama, formulir tersebut sudah diisi dengan data dari terakhir kali pengguna mengirimkannya. terdengar seperti sesuatu yang Django harus punya pintasannya - apakah ada? jika tidak, apa cara termudah untuk melakukannya?

Hal terbaik yang bisa saya lakukan adalah mengambil cleaned_data dan menyimpannya sebagai cookie, lalu membuat ulang formulirnya.


person olamundo    schedule 11.02.2011    source sumber


Jawaban (2)


Ini sepertinya rencana yang bagus. Namun jika tidak ada tekanan untuk menggunakan cookie, saya akan menggunakan sesi saja. Dengan begitu Anda tidak akan mencapai batas ukuran cookie, dan mengirimkan cookie dengan ukuran lebih tinggi dapat memperlambat waktu respons Anda.

form = MyForm(initial=request.session.get('form_data'))
...
if form.is_valid():
    request.session['form_data'] = form.cleaned_data
person Reiner Gerecke    schedule 11.02.2011
comment
jika Anda perlu memvalidasi lagi formulir yang dipulihkan karena alasan tertentu, lakukan form = MyForm(request.session.get('form_data'). Menggunakan inisial membuat formulir tidak terikat dan form.is_valid() selalu mengembalikan False meskipun tidak ada kesalahan. Formulir harus dibatasi ke data untuk menggunakan metode 'is_valid()'. - person javed; 09.08.2016
comment
Ini tidak akan berfungsi jika Anda memiliki tanggal di payload. Anda mendapatkan kesalahan ini: TypeError: Object of type 'date' is not JSON serializable. Anda dapat menggunakan: form_data = json.dumps(list(form.cleaned_data),cls=DjangoJSONEncoder) - person stephen; 12.04.2018

Sebagai perpanjangan dari ini, berikut adalah cara yang saya temukan untuk menggunakan sesi untuk menyimpan data formulir dengan tampilan berbasis kelas:

from django.views.generic.edit import FormView

class MyFormView(FormView):
    template_name = 'myform.html'
    form_class = MyForm
    success_url = '/success/'

    def get_form_kwargs(self):
        """
        The FormMixin uses this to populate the data from the POST request.
        Here, first try to populate it from the session data, if any;
        if there is POST data, it should override the session data.
        """
        kwargs = {'data': self.request.session.get('form_data', None)}
        kwargs.update(super(MyFormView, self).get_form_kwargs())
        return kwargs

    def form_valid(self, form):
        ...
        # save the form data to the session so it comes up as default next time
        self.request.session['form_data'] = form.cleaned_data
        ...
person Racing Tadpole    schedule 16.07.2013