2009-12-15 27 views
6

Tôi đang vật lộn với cách tạo các trang HTML tốt nhất ở Django có thể được sử dụng để hiển thị hoặc chỉnh sửa dữ liệu. Nghĩa là, tôi muốn các giá trị của trường xuất hiện dưới dạng văn bản ở chế độ hiển thị, nhưng trong các tiện ích của chúng khi ở chế độ chỉnh sửa/thêm. Có vẻ như Django không được thiết kế để làm điều này: các trường luôn xuất hiện trong các tiện ích của chúng (ví dụ: nhập văn bản, vùng văn bản, v.v.).Sử dụng Biểu mẫu Django để hiển thị và chỉnh sửa?

Có một kỹ thuật chung để xử lý việc này, không sử dụng biểu mẫu cho một và không phải là biểu mẫu khác không?

Tôi đã nghĩ đến một bộ lọc templatetag tùy chỉnh mà có thể được sử dụng cho mọi lĩnh vực hình thức, như:

{{form.field_name | render_field: Chế độ}}

nơi render_field hoặc là sẽ trở HTML của lĩnh vực tiện ích con hoặc chỉ giá trị dưới dạng văn bản, dựa trên chế độ.

Tôi đã bỏ lỡ điều gì đó hoặc đây có phải là giải pháp khả thi không?

Trả lời

3

Trả lời câu hỏi của riêng tôi. Tôi đã kết thúc với một giải pháp ba phần:

  1. đính kèm mô hình mẫu, vì vậy tôi sẽ có các widget hiển thị mặc định cho từng lĩnh vực
  2. viết dưới hình thức sử dụng một mẫu thẻ, đi qua nó dưới dạng .field, người sử dụng, và hành động
  3. viết một render mẫu thẻ để xử lý # 2

Bước một:

 
form.model = Model(...) 

Bước hai:

 

{{form.field1.label}} 
{% render form.field1 user action %} 


{{form.field2.label}} 
{% render form.field2 user action %} 

Bước ba:

Cái gì như:

 
def render(formfield, user, action, default_text="Private"): 
    if not user.is_authenticated(): 
     action = "view" 
    if action == "view": 
     if user.is_authenticated(): 
      fieldname = formfield.name 
      retval = str(getattr(formfield.form.model, fieldname)) 
     else: 
      retval = default_text 
    else: 
     retval = formfield.as_widget() 
    return retval 
0

Vì bạn đang lưu dữ liệu, bạn phải có một mô hình được đính kèm theo biểu mẫu bằng cách nào đó, một dạng mẫu hay không. Vì vậy, bạn chỉ có thể sử dụng mô hình đó trực tiếp để lấy các giá trị và hiển thị nó trong một mẫu như bạn muốn.

Đề xuất ở trên sẽ là có thể, nhưng vì các biểu mẫu có thể khá phức tạp, nên có lẽ đây không phải là một nhiệm vụ dễ dàng hoặc đáng để làm phiền. Phụ thuộc vào mức độ thường xuyên bạn muốn làm điều này. Nhưng sau đó có lẽ sẽ dễ dàng hơn để tạo bộ lọc cho mô hình thay vì biểu mẫu.

+0

Vâng, tôi có thể chỉ cần sử dụng các mô hình, nhưng điều đó không tận dụng lợi thế của bất cứ điều gì mà các hình thức có thể làm. Bộ lọc sẽ phải làm gì với điều này? Tôi có rất nhiều chế độ xem hiển thị/chỉnh sửa, do đó, một lựa chọn tốt có thể giúp chúng tôi không phải thực hiện mỗi lần hai lần (một lần để hiển thị, một lần để chỉnh sửa). –

0

trong một khuôn mẫu chính làm

{% if form %} 
    {% include 'form.html' %} 
{% else %} 
    {% include 'display.html' %} 
{% endif %} 

sau đó hai mẫu sẽ chỉ là một phần mà ám một hình thức, hoặc một div có tổ chức tốt đẹp. theo cách này, chế độ xem chỉnh sửa sẽ có biểu mẫu được xác định và chế độ xem hiển thị sẽ không. điều này sẽ dễ dàng hơn nhiều để theo dõi hơn những gì bạn đang cố gắng làm (mặc dù những gì bạn đang cố gắng sẽ có thể, tôi tin rằng phương pháp của bạn sẽ bị ảnh hưởng).

tôi làm điều này trong một ứng dụng blog để trang chỉnh sửa trông giống như trang hiển thị, do đó làm cho trang này cực kỳ trực quan để chỉnh sửa/viết blog. (Chưa kể đến điều này cho phép tôi để dễ dàng đưa một số ajax trong chỉnh sửa các mục trong bất kỳ quan điểm với một số hiệu ứng lạ mắt đẹp)

+0

Đây chính là điều tôi không muốn làm. Tôi không muốn có hai hình thức, nhưng một. –

0

Tôi có bị mất một cái gì đó

hình thức không chỉ hiển thị các widget lĩnh vực nhưng cũng xử lý dữ liệu bài đăng. Một bài đăng được gửi sẽ làm cho nó xử lý việc xóa dữ liệu, xử lý lỗi biểu mẫu và trường, v.v.

Đó là kiểu phá vỡ mẫu - tại sao tạo và biểu thị đối tượng biểu mẫu để tinh chỉnh nó không giống như một biểu mẫu?

Nếu bạn lo lắng về quá nhiều công việc trên các mẫu, hãy thử giải quyết nó bằng kế thừa mẫu theo cách tốt nhất có thể. Nếu bạn rất chắc chắn rằng bạn chỉ muốn thay đổi thẻ trường, bạn có thể thực hiện sth như

{% if form %} 
    {% for error in form.field.errors %} 
     {{ error|escape }} 
    {% endfor %} 
    {{ form.field }} 
{% else %} 
    {{ object.field }} 
{% endif %} 

cho mọi trường, nhưng IMO không phải là điểm, YMMV.

Ngoài ra những gì đến với tâm trí (suy nghĩ về giải pháp của bạn) là tự động đính kèm các vật dụng để hình thành các lĩnh vực, nhưng điều đó sẽ được overengineering.

0

Tôi gặp vấn đề tương tự. Ngay bây giờ tôi có các mẫu riêng biệt để hiển thị và chỉnh sửa; trước đây ám các trường đối tượng, các trường biểu mẫu thứ hai (nhưng đôi khi cũng là trường đối tượng, đối với những thứ không thể chỉnh sửa được). Cấu trúc HTML có thể khá phức tạp: ví dụ, trên một số trang, tôi có các bảng lớn thể hiện một hệ thống phân cấp đa cấp của các đối tượng. Kết quả là, tôi kết thúc với một số lượng lớn mã trùng lặp trong hai mẫu, ngược lại với DRY.

Tôi đã sử dụng bộ lọc mẫu với các trường biểu mẫu trước đây, để lưu mã khi hiển thị lỗi cùng với trường. Tôi nghĩ rằng nó sẽ là một giải pháp khả thi trong trường hợp này. Một khả năng khác có thể là sử dụng một lớp con ModelForm có thể được cho biết để hiển thị các phiên bản không thể chỉnh sửa của các trường. Điều này sẽ giúp giữ cho các mẫu đơn giản. Bạn thậm chí có thể hiển thị cả phiên bản tĩnh và phiên bản có thể chỉnh sửa của một trường và sử dụng JavaScript để chuyển đổi giữa chúng, kích hoạt và hủy kích hoạt chế độ chỉnh sửa.

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