2010-02-17 36 views
5

Tôi có định nghĩa khung nhìn (cố gắng) đưa ra một mô hình dưới dạng bảng. Đây là những gì tôi có cho đến nay:Mô hình Django đầu ra như Bảng

def output_table(request): 
    output = My_Model() 
    return render_to_response('outputtable.html', {'output': output}) 

Dưới đây là HTML cho outputtable.html:

<html> 
<table> 
    {{ output.as_table }} 
</table> 
</html> 

Tôi đang làm gì sai? Nó không hoạt động. Bây giờ, nó truyền mô hình chính xác, bởi vì nếu tôi thay đổi My_Model() thành My_Model.objects.all() và sau đó xuất nó chỉ đơn giản là {{output}} thì nó cho tôi thấy những gì tôi sẽ thấy trong vỏ Django.

Trả lời

0

Không có phương pháp as_table trên phiên bản mẫu (MyModel()) hoặc trên Querysets (MyModel.objects.all()). Bạn có thể đã thấy as_tablethe forms method as_table. Bạn không có một biểu mẫu ở đó.

Nếu bạn muốn in một cá thể mô hình/một bộ truy vấn dưới dạng bảng, bạn sẽ phải tự thiết kế nó.

0

Nếu bạn chỉ tìm cách để ra một mô hình cụ thể, thay đổi mẫu của bạn để một cái gì đó giống như

<tr> 
    <td>Name:</td> 
    <td>{{ output.name}}</td> 
</tr> 

cho tất cả các lĩnh vực mà bạn quan tâm. Nếu đây là điều bạn muốn có thể làm cho bất kỳ mô hình tùy ý nào trong ứng dụng của mình, hãy xem điều này snippet. Điều đó sẽ cung cấp cho bạn một bộ sưu tập trường để lặp lại.

2

Vì vậy, những gì bạn cần làm là như sau:

1) thêm

from django.forms import ModelForm để models.py bạn

2) thêm

class My_Model_Form(ModelForm): 
      class Meta: 
       model = My_Model 

3) trong quan điểm của bạn .py, thay đổi output = My_Model() to output = My_Model_Form()

Bây giờ bạn đã sẵn sàng. Vì vậy, mẹo là để kế thừa Form của bạn từ mô hình ban đầu của bạn.

+0

Nếu bạn đang kết xuất một cá thể mô hình hiện có, hãy thực hiện 'output = My_Model_Form (instance = my_model)' –

0

OMG đây là cũ nhưng Generic Views có vẻ phù hợp với vấn đề này, ít nhất là đối với tôi. Chế độ xem chi tiết Danh sách sẽ giúp tôi chạy nhanh hơn. :)

0

Tôi đã đưa ra giải pháp phù hợp với nhu cầu cụ thể của mình, hiển thị bất kỳ dữ liệu của mô hình đơn giản nào thành các hàng trong bảng. Thêm các bộ lọc sau vào templatetags/your_tags_file.py (đừng quên tập tin __init__.py trong thư mục templatetags):

from django import template 
register = template.Library() 

@register.filter() 
def as_table(model): 
    ret = "" 
    for name in model._meta.get_all_field_names(): 
     try: 
      field = str(getattr(model, name)) 
      if field: 
       ret += '<tr><td class="name">'+name+'</td><td class="field">'+field+'</td></td>' 
     except AttributeError: 
      pass 
    return ret 

Trong mẫu bây giờ bạn có thể chỉ cần làm:

{% load your_tags_file %} 
<table> 
    {{output|as_table|safe}} 
</table> 

Điều này sẽ làm cho mô hình trong một bảng đơn giản cho bạn. Bạn có thể dễ dàng thêm bất kỳ số logic theadtbody mong muốn nào khi bạn thấy phù hợp bằng cách sửa đổi logic về cách tạo ret. Hy vọng điều này sẽ giúp một ai đó.

1

Lớp models.Model không có phương thức as_table() như lớp forms.ModelForm.

Giải pháp của tôi là cũng sử dụng thẻ mẫu. Tôi đã đi với một inclusion tag.

myapp/templatetags/model_helpers.py

from django import template 
register = template.Library() 


@register.inclusion_tag('myapp/model_table.html', takes_context=True) 
def model_as_table(context, model_key=None, model_table_attrs_key=None): 

    if model_key is None: 
     model_key = 'object' 

    if model_table_attrs_key is None: 
     model_table_attrs_key = 'model_table_attrs' 

    try: 
     attrs = context[model_table_attrs_key] 
    except KeyError: 
     attrs = context[model_key]._meta.get_all_field_names() 

    table_context = {'rows': []} 
    for attr in attrs: 
     try: 
      value = str(getattr(context[model_key], attr)) 
      if value: 
       table_context['rows'].append({'attr': attr, 
               'value': context[model_key][attr]}) 
     except AttributeError: 
      pass 
     # Needs a way to display many_to_many fields. 
     except StopIteration: 
      pass 

    return table_context 

myapp/templates/myapp/model_table.html

{% for row in rows %} 
    <tr> 
     <td class="name">{{ row.attr }}</td> 
     <td class="field">{{ row.value }}</td> 
    </tr> 
{% endfor %} 

myapp/templates/myapp/outputtable.html

{% load model_helpers %} 

<table> 
    {% model_as_table %} 
</table> 

Với thực hiện điều này, bạn có thể vượt qua mà thuộc tính mô hình của bạn muốn hiển thị và thứ tự.

myapp/views.py

def output_table(request): 
    output = My_Model() 
    return render_to_response('outputtable.html', 
           {'output': output, 'model_table_attrs': ['attr1', 'attr2']}) 

Tôi cũng như html và trăn đang sạch riêng biệt này.

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