Django: บันทึกและกู้คืนสถานะของแบบฟอร์มโดยใช้คุกกี้

ฉันต้องการสร้างแบบฟอร์มที่ส่งไปแล้ว ในการแสดงแบบฟอร์มครั้งต่อไปสำหรับผู้ใช้คนเดียวกัน แบบฟอร์มจะถูกกรอกด้วยข้อมูลจากครั้งล่าสุดที่ผู้ใช้ส่ง ดูเหมือนเป็นสิ่งที่ django ควรมีทางลัดสำหรับ - มันมีหรือเปล่า? ถ้าไม่ใช่วิธีที่ง่ายที่สุดที่จะทำคืออะไร?

สิ่งที่ดีที่สุดที่ฉันคิดได้คือการดอง cleaned_data และบันทึกเป็นคุกกี้ จากนั้นสร้างแบบฟอร์มขึ้นมาใหม่ในภายหลัง


person olamundo    schedule 11.02.2011    source แหล่งที่มา


คำตอบ (2)


นี่ฟังดูเหมือนเป็นแผนที่ดีอยู่แล้ว แต่ถ้าไม่มีความกดดันในการใช้คุกกี้ ฉันจะหันไปใช้เซสชันแทน ด้วยวิธีนี้ คุกกี้จะไม่ถึงขีดจำกัดขนาด และการส่งคุกกี้ที่มีขนาดสูงกว่าอาจทำให้เวลาตอบสนองของคุณช้าลงได้

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
หากคุณต้องการตรวจสอบแบบฟอร์มที่กู้คืนอีกครั้งด้วยเหตุผลบางประการ ให้ form = MyForm(request.session.get('form_data') การใช้ชื่อย่อจะทำให้แบบฟอร์มไม่มีขอบเขต และ form.is_valid() จะส่งคืนค่า False เสมอแม้ว่าจะไม่มีข้อผิดพลาดก็ตาม แบบฟอร์มจะต้องเชื่อมโยงกับข้อมูลเพื่อใช้เมธอด 'is_valid()' - person javed; 09.08.2016
comment
สิ่งนี้จะไม่ทำงานหากคุณมีวันที่ในเพย์โหลด คุณได้รับข้อผิดพลาดนี้: TypeError: Object of type 'date' is not JSON serializable คุณสามารถใช้: form_data = json.dumps(list(form.cleaned_data),cls=DjangoJSONEncoder) - person stephen; 12.04.2018

เพื่อเป็นส่วนขยายของสิ่งนี้ นี่คือวิธีที่ฉันพบว่าใช้เซสชันเพื่อบันทึกข้อมูลแบบฟอร์มด้วยมุมมองตามคลาส:

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