2010-01-31 46 views
16

Tôi có một bộ định tuyến nội tuyến cho một mô hình, có một ràng buộc unique_together. Và như vậy, khi tôi dữ liệu đầu vào, mà không thực hiện đầy đủ chế này, nó sẽ hiển thị:Django: Hiển thị lỗi định dạng chính xác

__all__Please correct the duplicate values below.

Mã, mà thực hiện điều này là:

{% for error in formset.errors %} 
     {{ error }}<br/> 
    {% endfor %} 

tôi không nhiều giống như số __all__ ở đầu lỗi và rõ ràng là khóa từ điển, vì vậy tôi đã thử:

{% for key, error in formset.errors %} 
     {{ key }}: {{ error }}<br/> 
    {% endfor %} 

Nhưng sau đó tất cả tôi nhận được là:

__all__:

{{error}} sẽ không hiển thị ở tất cả. Vì vậy, những gì đang xảy ra ở đây? Và làm cách nào để hiển thị lỗi chính xác?

Trả lời

24

Tôi nghĩ rằng vấn đề ở đây là formset.errors là danh sách các từ điển, không phải là một từ điển duy nhất.

Từ Django docs page on formsets:

>>> formset.errors 
[{}, {'pub_date': [u'This field is required.']}] 

Xem nếu một cái gì đó như thế này sửa chữa vấn đề: (cập nhật dựa trên những người hỏi ý kiến ​​)

{% for dict in formset.errors %} 
    {% for error in dict.values %} 
     {{ error }} 
    {% endfor %} 
{% endfor %} 

Nếu thất bại, tôi muốn thử sử dụng manage.py shell, và cố gắng tái tạo tình hình của bạn trong vỏ trăn ... theo cách đó sẽ dễ dàng kiểm tra các giá trị khác nhau và tìm ra những gì bạn cần làm.

+0

Cảm ơn :) hữu ích. Cách của bạn không hoạt động, nhưng cuối cùng tôi đã làm việc với một sửa đổi nhỏ (errors.values ​​thay vì lỗi), do đó, nó bây giờ trông như thế này: {% cho dict trong formset.errors%} {% cho lỗi trong dict.values%} {{error}} {% endfor%} {% endfor%} –

+0

Vui vì tôi có thể trợ giúp. Tôi đã cập nhật câu trả lời của tôi dựa trên nhận xét của bạn. Dường như vấn đề chính đã gây rối nó trước đó là 'formset.errors' là một danh sách các dicts, không phải là một dict duy nhất. –

+0

Đối với phiên bản hiện tại của django, lặp qua các lỗi trong các mẫu thường không phải là những gì bạn muốn. Kể từ khi OP hỏi ở cuối "... làm thế nào để tôi hiển thị lỗi một cách chính xác?", Tôi sẽ tham khảo các câu trả lời khác không liên quan đến việc lặp qua các lỗi. – dsalaj

5

Các vòng lặp for là không cần thiết, các lỗi này sẽ được hiển thị một cách chính xác như sau:

{{ formset.non_form_errors }} 
2

Django 1,6 formsets có một phương pháp mới, BaseFormSet.total_error_count. Sử dụng điều này trong một mẫu có điều kiện đảm bảo bạn sẽ chỉ xuất ra các lỗi và đánh dấu nếu có ít nhất một lỗi tồn tại trong bộ định dạng.

{% if formset.total_error_count %} 
    <ul class="errorList"> 
    {% for dict in formset.errors %} 
     {% for error in dict.values %} 
     <li>{{ error }}</li> 
     {% endfor %} 
    {% endfor %} 
    </ul> 
{% endif %} 

Xem Django docs page cho v1.6 +.

0

Đây là một giải thích cho bất cứ ai gặp phải vấn đề tương tự sai sót không được trả lại trong mẫu:

Nếu bạn có và lỗi liên quan đến việc formset như một toàn thể, sử dụng:

{{ formset.non_form_errors }} 

này về cơ bản trả về lỗi trong mục __all__ nhập từ formset.errors.Đây là tài liệu như:

""" 
    Returns an ErrorList of errors that aren't associated with a particular 
    form -- i.e., from formset.clean(). Returns an empty ErrorList if there 
    are none. 
    """ 

Tuy nhiên nếu bạn đang render hình thức từ formset và một số lỗi không là renderd, bạn có lẽ mất tích:

{% for form in formset.forms %} 
    {# ... #} 
    {{ form.non_field_errors }} 
{% endfor %} 

này trả về sai sót trong __all__ nhập từ form.errors. Đó là, tương tự như non_form_errors, các lỗi không liên kết với một trường cụ thể, mà đúng hơn là với các quan hệ trường. Ví dụ, nếu bạn đã có một hình thức với các lĩnh vực FromTo, và bạn xác nhận nếu From giá trị nhỏ hơn thì To giá trị, thẻ {{ form.non_field_errors }} có thể khiến các lỗi sau:

'The From value must be smaller than the To value' 
+0

Nếu bạn muốn đặt formset.non_form_errors tự giá trị, hãy sử dụng cú pháp sau đây 'formset._non_form_errors =" thông báo lỗi của tôi "' (Lưu ý dấu gạch dưới trước non_form_errors) – Ben

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