2009-08-10 39 views
19

Có cách nào thông minh để tạo biểu mẫu django hiển thị trường có dấu hoa thị sau các trường được yêu cầu không? Hoặc để cung cấp một số thông minh khác để đánh dấu các trường bắt buộc? Tôi không muốn phải làm điều đó một lần nữa trong một mẫu nếu tôi đã thiết lập một trường theo yêu cầu trong biểu mẫu.Làm cách nào để hiển thị trường biểu mẫu với thông tin được yêu cầu

Trả lời

29

Kể từ Django 1.2, nếu biểu mẫu của bạn có thuộc tính có tên required_css_class, nó sẽ được thêm vào BoundField.css_classes cho các trường bắt buộc. Sau đó, bạn có thể sử dụng CSS để tạo kiểu cho các phần bắt buộc của biểu mẫu như mong muốn. Một trường hợp sử dụng điển hình:

# views.py 
class MyForm(django.forms.Form): 
    required_css_class = 'required' 
    … 

...

/* CSS */ 
th.required { font-weight: bold; } 

...

<!-- HTML --> 
<tr> 
    <th class="{{form.name.css_classes}}">{{form.name.label_tag}}</th> 
    <td>{{form.name.errors}}{{form.name}}</td> 
</tr> 

Nếu bạn sử dụng Form.as_table(), Form.as_ul, và Form.as_p, họ làm điều này tự động, thêm các lớp để <tr>, <li><p>, tương ứng.

+8

Lưu ý rằng bạn có thể sử dụng chỉ thị nội dung css để thêm dấu hoa thị sử dụng cùng phương thức này: 'th.required: after {content: '*'}' –

1

Cách tốt nhất cho các mục đích như vậy mà tôi đã tìm thấy là hiển thị kết quả của biểu mẫu thông qua mẫu html. Cách thực hiện điều này được mô tả here. Nhờ may mắn, ví dụ này đặt dấu hoa thị sau các trường bắt buộc giống như bạn muốn.

+0

Không có biểu mẫu nào được hiển thị {{form}}, tôi gọi một cách rõ ràng, vì tôi thường chỉ hiển thị tập con của các trường của biểu mẫu. Tôi cần một cái gì đó thấp hơn, giống như một thuộc tính của một lĩnh vực hoặc một widget. – gruszczy

+0

Nếu bạn đang nói về modelforms và sử dụng thuộc tính 'fields' của lớp Meta để xác định một tập con của các trường hiển thị, điều này sẽ hoạt động. Nếu bạn có các biểu mẫu không phải là mô hình và có các trường ẩn, một lần nữa nó sẽ hoạt động. Tôi đang vội vàng, xin lỗi nếu tôi thiếu cái gì đó? – shanyu

+0

Tôi có một Mẫu đơn được sử dụng trong nhiều mẫu và tôi thường gọi tất cả các trường tôi cần trong mẫu. Đó là lý do tại sao tôi không thể sử dụng hiển thị khuôn mẫu. Nhưng có vẻ như nó sẽ tốt hơn, Nếu tôi vừa tạo một số lớp con với Meta và sau đó sử dụng template này. Đó là ý tưởng hay, tôi phải suy nghĩ về nó. – gruszczy

1

Tôi sử dụng thẻ mẫu để hiển thị các trường biểu mẫu có nhãn và lỗi của chúng, cộng với dấu hoa thị và lớp CSS cho các trường bắt buộc. Có nhiều đoạn trích khác nhau để làm điều đó trên www.djangosnippets.org

+0

Vì vậy, hiện tại tôi có nghĩa là tôi sử dụng bộ lọc để thực hiện việc này. Tuy nhiên, điều này không phải là rất khô. Tôi muốn đặt cài đặt này vào biểu mẫu (một số 'mark_required = True' trong biểu mẫu). – gruszczy

0

Cá nhân Tôi đã thử một cái gì đó như thế này, nghĩa là ghi đè thẻ mẫu mặc định (điều này thêm dấu hoa thị màu đỏ trong tất cả giao diện quản trị cho các trường không phải chỉ đọc. Sau đó, tôi cũng đã xác định thẻ thứ 2 cho chế độ xem của mình. nhãn Xem mã dưới đây (copy/paste mã nguồn Django với một số sửa đổi):.

trong settings.py:

from django.forms.util import flatatt 
from django.utils.html import conditional_escape 
from django.utils.safestring import mark_safe 
import django.forms.forms as django_forms 
def custom_label_tag(self, contents=None, attrs=None): 
     """ 
     Wraps the given contents in a <label>, if the field has an ID attribute. 
     Does not HTML-escape the contents. If contents aren't given, uses the 
     field's HTML-escaped label. 

     If attrs are given, they're used as HTML attributes on the <label> tag. 
     """ 
     contents = contents or conditional_escape(self.label) 
     widget = self.field.widget 
     id_ = widget.attrs.get('id') or self.auto_id 
     if id_: 
      attrs = attrs and flatatt(attrs) or '' 
      if self.field.required: 
       label = unicode(contents) 
       label_suffix = "" 
       if label[-1] == ":": 
        label = label[:-1] 
        label_suffix += ":" 
       contents = u'<label for="%s"%s>%s<span style="color:red;">*</span>%s</label>' % (widget.id_for_label(id_), attrs, label, label_suffix) 
      else: 
       contents = u'<label for="%s"%s>%s</label>' % (widget.id_for_label(id_), attrs, unicode(contents)) 
     return mark_safe(contents) 

def custom_inline_label_tag(self, contents=None, attrs=None): 
    if attrs: 
     if "class" in attrs.keys(): 
      attrs["class"] += " inline" 
     else: 
      attrs["class"] = "inline" 
    else: 
     attrs = {"class": "inline"} 
    return self.label_tag(contents, attrs) 
django_forms.BoundField.label_tag = custom_label_tag # override django method 
django_forms.BoundField.inline_label_tag = custom_inline_label_tag 

trong mẫu của tôi

<p>{{ form.fieldname.errors}}{{ form.fieldname.inline_label_tag }}{{form.fieldname}}</p> 
OR 
<p>{{ form.fieldname.errors}}{{ form.fieldname.label_tag }}{{form.fieldname}}</p> 
2

Bạn cũng có thể sử dụng thuộc tính field.field.required:

{% for field in form %} 
    {{field.label}} {% if field.field.required %} * {% endif %} 
    {{field}} 
    {{field.errors}} 
{% endfor %} 
Các vấn đề liên quan