在由django tables2创建的表的列中创建按钮

问题描述 投票:1回答:1

我有一个扩展的管理模型,可以创建操作按钮。我创建了一个视图来做同样的事情。我使用过tables2,一切都很好,除了动作栏。我找不到在表格中生成相同按钮的方法。有没有办法做到这一点?

tables.朋友

from .models import Ticket
import django_tables2 as tables
'''from .admin import river_actions, create_river_button'''

class TicketTable(tables.Table):

    class Meta:
        model=Ticket
        template_name='django_tables2/table.html'
        fields = ('id','subject','request_type','material_type','productline','business','measurement_system',
            'created_at','updated_at','status','river_action','project') # fields to display
        attrs = {'class': 'mytable'}
        '''attrs = {"class": "table-striped table-bordered"}'''
        empty_text = "There are no tickets matching the search criteria..."

admin.py(包含模型的部分等)

# Define a new User admin to get client info too while defining users
class UserAdmin(BaseUserAdmin):
    inlines = (UserExtendInline, )


def create_river_button(obj,proceeding):
        return '''
            <input
                type="button"
                style=margin:2px;2px;2px;2px;"
                value="%s"
                onclick="location.href=\'%s\'"
                />
        '''%(proceeding.meta.transition,
             reverse('proceed_ticket',kwargs={'ticket_id':obj.pk, 'next_state_id':proceeding.meta.transition.destination_state.pk})
             )

class TicketAdmin(admin.ModelAdmin):

    list_display=('id','client','subject','request_type','material_type','productline','business','measurement_system', \
                  'created_at','updated_at','created_by','status','river_actions')

    #list_display_links=None if has_model_permissions(request.user,Ticket,['view_ticket'],'mmrapp')==True else list_display

    #list_display_links=list_display #use None to remove all links, or use a list to make some fields clickable
    #search_fields = ('subject','material_type')
    list_filter=[item for item in list_display if item!='river_actions'] #exclude river_actions since it is not related to a field and cannot be filtered

    #Using fieldset, we can control which fields should be filled by the user in the ADD method. This way, created_by will be the
    #logged in user and not a drop down choice on the admin site
    fieldsets = [
        (None, { 
            'fields': ('client','subject','description','request_type','material_type', \
                       'productline','business','measurement_system', 'project') 
            } ), #to make some field appear horizontal, put them into a []
    ]

    formfield_overrides = {
        models.CharField: {'widget': TextInput (attrs={'size':'40'})},
        models.TextField: {'widget': Textarea(attrs={'rows':4, 'cols':80})},}


    def get_list_display(self, request):
        self.user=request.user
        return super(TicketAdmin,self).get_list_display(request)


    def river_actions(self,obj):
        content=""
        for proceeding in obj.get_available_proceedings(self.user):
            content+=create_river_button(obj, proceeding)

        return content

    river_actions.allow_tags=True

    #override save_model method to save current user since it is not on the admin page form anymore
    def save_model(self, request, obj, form, change):
        if not change:
            # the object is being created and not changed, so set the user
            obj.created_by = request.user
        obj.save()

views.朋友

def display_tickets(request):
    table = TicketTable(Ticket.objects.all())
    RequestConfig(request).configure(table)
    '''table = CustomerTable(Customer.objects.filter(self.kwargs['company']).order_by('-pk'))'''
    return render(request,'mmrapp/ticket_display.html',{'table':table})

在管理页面中创建的按钮:enter image description here

在视图中使用tables2创建的表缺少按钮:enter image description here

django django-views django-tables2
1个回答
0
投票

您必须将empty_values=()传递给该列,因为默认情况下,如果该列的empty_values中未包含该值,则django-tables2仅呈现该列。

import django_tables2 as tables

from .admin import river_actions, create_river_button
from .models import Ticket


class TicketTable(tables.Table):
    river_action = tables.Column(empty_values=())

    class Meta:
        model=Ticket
        template_name='django_tables2/table.html'
        fields = (
            'id', 'subject', 'request_type', 'material_type', 'productline', 'business', 'measurement_system',
            'created_at', 'updated_at', 'status', 'river_action', 'project'
        ) # fields to display
        attrs = {'class': 'mytable'}
        empty_text = "There are no tickets matching the search criteria..."

    def render_river_action(self, record):
        return create_river_button(record, ...)

这也被记录为Table.render_foo methods

© www.soinside.com 2019 - 2024. All rights reserved.