2015-11-10 16 views
6

Tôi có một vài biểu mẫu tôi đã thêm vào trình hướng dẫn, nhưng trạng thái biểu mẫu chỉ được duy trì cho bước cuối cùng và thực hiện() không được thực hiện.Trạng thái SessionWizardView chỉ được lưu trên biểu mẫu cuối cùng, thực hiện() không được thực thi

Tôi đã tạo ra những điều sau đây, dựa trên các ví dụ về tài liệu của django, để cố gắng tìm hiểu phần cuối của điều này. Dường như bước cuối cùng là bước duy nhất để lưu trạng thái khi di chuyển giữa các bước.

class OneForm(Form): 
    field_one = forms.CharField(label='1', max_length=100) 
    field_two = forms.CharField(label='2', max_length=100) 
    field_three = forms.CharField(label='3', max_length=100) 
class TwoForm(Form): 
    field_one = forms.CharField(label='4', max_length=100) 
    field_two = forms.CharField(label='5', max_length=100) 
    field_three = forms.CharField(label='6', max_length=100) 

TEST_WIZARD_FORMS = [ 
    ("one", OneForm), 
    ("two", TwoForm), 
] 
TEST_TEMPLATES = { 
    'one': 'tour/one.html', 
    'two': 'tour/two.html', 
} 
class TestWizardView(SessionWizardView): 
    form_list = TEST_WIZARD_FORMS 
    def done(self, form_list, **kwargs): 
     print('done executed') 
     return reverse('home') 
    def get_template_names(self): 
     return [TEST_TEMPLATES[self.steps.current]] 

và điều này cho các mẫu (cả one.html và two.html là giống hệt nhau)

<html> 
<body> 
<p>Step {{ wizard.steps.step1 }} of {{ wizard.steps.count }}</p> 
<form action="" method="post">{% csrf_token %} 
<table> 
{{ wizard.management_form }} 
{% if wizard.form.forms %} 
    {{ wizard.form.management_form }} 
    {{ wizard.form.non_field_errors }} 
    {{ wizard.form.errors }} 
    {% for form in wizard.form.forms %} 
     {{ form }} 
    {% endfor %} 
{% else %} 
    {{ wizard.form }} 
{% endif %} 
</table> 
{% if wizard.steps.prev %} 
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.first }}">"first step"</button> 
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.prev }}">"prev step"</button> 
{% endif %} 
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.next }}">"next step"</button> 
<input type="submit" value="submit"/> 
</form> 
</body> 
</html> 

Nếu tôi nhập dữ liệu trên bước 1, tiến hành bước 2 và nhập dữ liệu, sau đó quay lại bước 1, bước đầu tiên không có dữ liệu được lưu và không có lỗi biểu mẫu nào được hiển thị. Khi tôi nhấn bên cạnh để quay lại bước 2, dữ liệu của bước 2 vẫn còn hiện diện. Cố tình đưa dữ liệu không hợp lệ vào bước 1 đã cho tôi thấy rằng nó không xác thực biểu mẫu, vì thuật sĩ tiếp tục bước 2 mà không hiển thị lỗi.

Khi tôi gửi biểu mẫu, thực hiện() không thực thi. Điều này có ý nghĩa nếu chỉ bước cuối cùng thực sự thành công, nhưng không thấy lỗi nào ở bước 1 khiến tôi bối rối.

Tại sao dữ liệu biểu mẫu không được duy trì ngoại trừ biểu mẫu cuối cùng? Tại sao bước cuối cùng là bước duy nhất thực sự xác nhận dữ liệu biểu mẫu? Tại sao thực hiện không được thực thi?

Cập nhật: Có vẻ như việc xác thực biểu mẫu đang diễn ra sau đó và tôi thấy nó thành công qua việc in thông tin liên quan trong chức năng bài đăng, nhưng thực hiện() dường như vẫn chưa được thực thi.

Cảm ơn bạn.

Trả lời

1

Bước 1 trong tài liệu được tìm thấy here là câu trả lời. Nó nói như sau.

Người dùng truy cập trang đầu tiên của trình hướng dẫn, điền vào biểu mẫu và gửi biểu mẫu đó.

Chìa khóa ở đây là "gửi". Không có xác nhận biểu mẫu hoặc trạng thái được lưu trừ khi biểu mẫu được gửi. Sử dụng wizard_goto_step cho kế tiếp/trước/nhảy không gửi biểu mẫu, không xác nhận biểu mẫu và không lưu biểu mẫu trong phiên/cookie (tùy thuộc vào bạn chọn).

Điều hiển nhiên là bây giờ, nhưng tôi vẫn nghĩ điều này gây hiểu nhầm cho người dùng cuối tiềm năng của trình hướng dẫn biểu mẫu. Nó đủ dễ dàng để tôi thay thế wizard_goto_step bằng cách gửi thực tế khi chuyển sang bước tiếp theo, nhưng khi người dùng nhập một số dữ liệu vào biểu mẫu và sau đó chọn truy cập lại một bước khác, tất cả dữ liệu của họ trên bước đó sẽ bị mất.

Có vẻ như dữ liệu biểu mẫu sẽ được lưu ngay cả khi không hoàn thành. Ý định của tôi là lưu dữ liệu này theo cách thủ công bằng cách sử dụng hàm storage.set_step_data(), vì tất cả các bước biểu mẫu được xác thực lại ở chế độ xử lý cuối cùng. Ngay cả khi người dùng điền vào dữ liệu không chính xác trên một bước, họ vẫn sẽ được chuyển hướng đến bước có dữ liệu bị thiếu ở cuối. Điều này cảm thấy như hành vi tốt hơn xóa mù quáng dữ liệu của người dùng trên một bước khi họ truy cập một bước trước đó.

0

Đó chắc chắn là lỗi. Bạn phải xóa các dòng mã sau khỏi

\ formtools \ wizard \ lượt xem.py

 # walk through the form list and try to validate the data again. 
#   for form_key in self.get_form_list(): 
#    form_obj = self.get_form(step=form_key, 
#     data=self.storage.get_step_data(form_key), 
#     files=self.storage.get_step_files(form_key)) 
#    if not form_obj.is_valid(): 
#     return self.render_revalidation_failure(form_key, 
#               form_obj, 
#               **kwargs) 
#    final_forms[form_key] = form_obj 

Thực ra tôi không hiểu lý do của mã này. Mọi biểu mẫu đều được xác thực sau khi được gửi. Tôi không thấy lý do nào để xác nhận lại chúng?

Xác thực này không thành công vì một số lý do không xác định và đó là lý do tại sao quy trình thực hiện sau này không bao giờ được gọi.

Các vấn đề liên quan