Search code examples
pythondjangodjango-tables2

Pushing Arguments into Tables2 using kwargs in Django Python


I am attempting to push data from a DJANGO view into the Tables object, passing it through as an argument. In this case, I would like to pass a variable called doc_id into a Tables2 object called tableName

In this example, I have set doc_id as 1, and pass it into the

View

def editorView(request):

    doc_id = 1

    table = tableName(UserProfile.objects.filter(), doc_id=doc_id)

Table

class tableName(tables.Table):

    tbl_doc_id = None           ## Creating a temporary variable

    def __init__(self, *args, **kwargs):
        temp = kwargs.pop("doc_id")   ## Grab doc_ID from kwargs
        super(tableName, self).__init__(*args, **kwargs)
        self.tbl_doc_id = temp   ## Assign to self.tbl_doc_id for use later

    ### Do something with tbl_doc_id
    modelFilter = model.objects.filter(pk = tbl_doc_id)

When running the debugger, I can see that tbl_doc_id is still assigned as None, rather than 1.

What is the correct way to pass arguments into a Tables2 instance? Is it possible?

EDIT: Adding more information for context.

In the real world scenario, I have a view. That view takes an argument from the URL called doc_id. That doc_id is used to grab an object from a model called 'MaterialCollection', and return it as 'mc'.

'mc' is then passed into the table

View

def editorView(request, doc_id):
    try:
        mc = MaterialCollection.objects.get(pk = doc_id)
    except Material.DoesNotExist:
        raise Http404("Document does not exist")

    config = RequestConfig(request) 
    unnassigned_User_Table = unassignedUserTable(UserProfile.objects.filter(), mc=mc)

... Other code + Render ...

From my table, I create a custom LinkColumn. That linkColumn is used to construct a URL based upon a number of Attributes from the model 'UserProfile', and from mc.

Table

class unassignedUserTable(tables.Table):

    mc = None

    def __init__(self, *args, **kwargs):
        temp_mc = kwargs.pop("mc")
        super(unassignedUserTable, self).__init__(*args, **kwargs)
        self.mc = temp_mc

    current_Assignment = "NONE"
    new_Assignment = "AS"

    assign_Reviewer = tables.LinkColumn('change_Review_AssignmentURL' , args=[ A('user'), current_Assignment, new_Assignment, mc, A('id')], empty_values=(), attrs={'class': 'btn btn-success'})

    class Meta:
        model = UserProfile

        ... Setup excludes/sequence/attributes...

In this particular instance. mc has a FK to UserProfile (in a 1:M) relationship.


Solution

  • I see that the name of your table class is tableName so if you want __init__ to work as expected please change the line:

    super(unassignedUsers, self).__init__(*args, **kwargs)
    

    to

    super(tableName, self).__init__(*args, **kwargs)
    

    Beyond this obvious problem, there are some more issues with your code:

    • Your classes must start with a capital letter (TableName instead of tableName)
    • Your table classes should end end with -Table (for example NameTable)
    • I am using django-tables2 for many years and never needed to pass something in __init__ as you are doing here. Are you sure that you really need to do this?
    • If you want to filter the table's data the filtering must be done to your view - the table will get the filtered data to display.