2011-02-09 82 views
5

Giả sử tôi có các mẫu sau:Django - Làm thế nào để thêm thuộc tính html với các hình thức trên các mẫu

<div id="openid_input_area"> 
{{ form.openid_identifier }} 
    <input name="bsignin" type="submit" value="{% trans "Sign in" %}"> 
</div> 

Làm thế nào tôi có thể thêm một lớp css để form.openid_identifier?

Như tôi tôn trọng những SOC nguyên tắc và tôi hy vọng các nhà thiết kế để cải thiện các mẫu tôi làm KHÔNG muốn làm điều này trên mô hình hình thức nhưng trên mẫu riêng của mình.

Tôi không thể tìm thấy bất kỳ điều gì về điều này trên tài liệu. Có cách nào để thực hiện điều này trên mẫu không?

Trả lời

16

tôi đã quản lý để mã hóa một giải pháp đơn giản cho vấn đề của tôi:

Tôi đã viết một custom template tag:

from django import template 

register = template.Library() 

def htmlattributes(value, arg): 
    attrs = value.field.widget.attrs 


    data = arg.replace(' ', '') 

    kvs = data.split(',') 

    for string in kvs: 
     kv = string.split(':') 
     attrs[kv[0]] = kv[1] 

    rendered = str(value) 

    return rendered 

register.filter('htmlattributes', htmlattributes) 

Và tất cả tôi phải làm tại mẫu là:

{{ form.openid_identifier|htmlattributes:"class : something, id: openid_identifier" }} 
2

Tôi không biết bất kỳ cách nào khác trong đồng bằng Django. Các phím tắt như form.field hoặc form.as_p thực sự giúp bạn bắt đầu, nhưng cuối cùng có thể rơi trở lại trên html thuần túy. Đó là cách tôi nhìn thấy nó. Không phải để nói rằng không có bất kỳ nhu cầu kiểm soát nhiều hơn về rendering. Tôi nhớ đọc this discussion about form rendering trên danh sách gửi thư của Django.

Simon Willison đang/đang làm việc trên thư viện để cung cấp cho nhà thiết kế quyền kiểm soát nhiều hơn, bạn có thể tìm thấy nguồn của mình on github. Nó lớn hơn một chút, vì vậy nó thậm chí còn không hoạt động nữa. Nhưng liên quan đến câu hỏi của bạn, ví dụ này có vẻ như nó có thể được sử dụng cho bạn:

{% field form.name class="myclass" %} 
<!-- renders as --> 
<input type="text" name="name" id="id_name" class="myclass"> 

Thực tế chức năng này nên dễ dàng đạt được. Bạn cần một thẻ mẫu chấp nhận một trường biểu mẫu, cập nhật các thuộc tính widget (các thuộc tính mà bạn có thể đặt trên biểu mẫu đã có) và hiển thị trường đó.

Lặp lại biểu mẫu sẽ mang lại các phiên bản BoundField, hiển thị chính nó với phương pháp __unicode__ của nó. Bạn sẽ cần phải chuyển tất cả các đối số từ khóa đến hàm render của widgets. Một dự thảo của ý tưởng này:

@register.simple_tag 
def field(boundfield, **kwargs): 
    if self.field.show_hidden_initial: 
     return self.as_widget(attrs=kwargs) + self.as_hidden(only_initial=True) 
    return self.as_widget(attrs=kwargs) 
Các vấn đề liên quan