Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.0k views
in Technique[技术] by (71.8m points)

django - Taking method of the related model into a separate column of jqgrid

I am using django 1.4 together with jqgrid from django_gems package The following code is trying to bring the virtual column onto the grid by concatenating first and last name.

However it fails with

Cannot resolve keyword client__get_fullname into field.

Is there any acceptable way to achieve this?

 class Car(models.Model):
     number = models.CharField(max_length = 50)
 client = models.ForeignKey('Client')

 class Client(models.Model):
     first_name = models.CharField(max_length = 50)
 last_name = models.CharField(max_length = 50)
 def get_fullname(self):
     return '%s %s' % (self.first_name, self.last_name)

 from django_gems.jqgrid
 import JqGrid
 class CarGrid(JqGrid):
     queryset = Car.objects.all()
 fields = ['number', 'client__get_fullname']

 jqgrid config = {
     "altRows": true,
     "rowList": [10, 25, 50, 100],
     "sortname": "id",
     "viewrecords": true,
     "autowidth": false,
     "forcefit": false,
     "shrinkToFit": false,
     "height": "auto",
     "colModel": [{
         "index": "id",
         "editable": false,
         "name": "id",
         "label": "ID"
     }, {
         "index": "number",
         "editable": false,
         "name": "number",
         "label": "number"
     }, {
         "index": "first_name",
         "editable": false,
         "name": "client__first_name",
         "label": "first name"
     }],
     "caption": "Cars",
     "datatype": "json",
     "gridview": true,
     "sortorder": "asc",
     "viewsortcols": true,
     "url": "main/examplegrid",
     "rowNum": 10,
     "pager": "#pager",
     "jsonReader": {
         "repeatitems": false
     }
 }

 sample data = {
     "total": 1,
     "records": 1,
     "rows": [{
         "client__first_name": "Bill",
         "client__last_name": "Clinton",
         "id": 1,
         "number": "111222"
     }],
     "page": 1
 }
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

OK! Let us you get the JSON data

{
    "total": 1,
    "records": 1,
    "rows": [
        {
            "client__first_name": "Bill",
            "client__last_name": "Clinton",
            "id": 1,
            "number": "111222"
        }
    ],
    "page": 1
}

and the jqGrid contains an additional column

{name: "client__full_name", label: "full name"}

which should be constructed from client__first_name and client__last_name. In the case the most simplest way would be to use beforeProcessing callback function:

$("#list").jqGrid({
    url: "main/examplegrid",
    datatype: "json",
    colModel: [
        {name: "id", label: "ID"},
        {name: "client__first_name", label: "first name"},
        {name: "client__last_name", label: "last name"},
        {name: "client__full_name", label: "full name"}
    ],
    gridview: true,
    jsonReader: { repeatitems: false },
    //... other parameters
    beforeProcessing: function (data) {
        var items = data.rows, n = items.length, i, item;
        for (i = 0; i < n; i++) {
            item = items[i];
            item.client__full_name = item.client__first_name + ' ' +
                item.client__last_name;
        }
    }
});

The callback function beforeProcessing will be called by jqGrid after the data are received from the server and before the data will be processed. So in the simple way we can implement any "virtual" column.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...