【问题标题】:Creating buttons in a column of a table created by django tables2在 django tables2 创建的表的列中创建按钮
【发布时间】:2019-01-20 18:46:09
【问题描述】:

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

tables.py

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.py

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})

在管理页面中创建的按钮:

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

【问题讨论】:

  • 注意正确格式化代码示例会有所帮助。
  • @Jieter 哦,我没有注意到,因为我复制粘贴了整个代码的一部分,我会修复它,谢谢!

标签: django django-views django-tables2


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回答。我试过了,似乎某事不起作用。我没有收到特定错误,因为它无法呈现。我收到了This site can’t be reached 127.0.0.1 refused to connect.。你放的那 3 个点是代码的一部分,还是你想让我用 sth 替换它?
  • 是的,我不确定第二个参数应该是什么,你需要用正确的参数替换它。
  • 首先,我们创建了render_river_action,但我们从未在任何地方使用它,create_river_button 已在admin.py 中定义,您可以看看,我们需要传递相同的对象还是应该传递如果我们只使用record 就可以了吗?
  • 我是 django 新手,如果我看起来一无所知,请见谅!
  • 我发现导入river_actions 是问题所在,我将其删除。我尝试不使用额外的参数 = return create_river_button(record) 并在列中为所有行返回 None
猜你喜欢
  • 2014-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
  • 2011-01-01
  • 2011-06-26
  • 2015-02-11
  • 1970-01-01
相关资源
最近更新 更多