I am creating a call reports dashboard in django, and I want to output a postgresql Select query in an HTML table for each date of the month like this:
And this is the output that I am receiving. It is just giving me totals for each extension for the month in each table instead of the total for that distinct date. I tried to change the query to
For whatever reason I am having a very hard time figuring this out. This is my HTML, I know I am not doing the looping right here, I've just been running out of ideas.
{% for i in lt.itertuples %}
<table class="table" style="float:left">
<caption>{{ i.to_date }}</caption>
<thead>
<tr>
<th>Extension</th>
<th>Calls</th>
</tr>
</thead>
{% for d in df4.itertuples %}
<tr>
<td>
{{ d.member_extension }}
</td>
<td>
{{ d.count }}
</td>
</tr>
{% endfor %}
</table>
{% endfor %}
</div>
And this is a snippet of my Python:
query=pd.read_sql_query("select DISTINCT date(start_date) as 'DATE()' from Reports3; ",con3)
query2=pd.read_sql_query("SELECT COUNT(*),member_extension from Reports3 group by member_extension ",con3)
df4 = pd.DataFrame(query)
lt = pd.DataFrame(query2)
ext4=pd.unique(df4['member_extension'])
context={'df4':df4, 'ex4':ext4, 'lt':lt }
return render(request,'index2.html',context)
I tried changing the Query to:
SELECT DISTINCT TO_DATE(start_date,'YYYY-MM-DD'), COUNT(*),member_extension from Reports3 group by member_extension,TO_DATE(start_date,'YYYY-MM-DD') ORDER BY TO_DATE(start_date,'YYYY-MM-DD')
And that outputs this result:
Related
Good day,
I'm asking myself, if it's possible to transfer multiple informations as primary-keys inside my template!?
For example, when clicking on a link inside my table...
In this case im transfering the item-id:
<tbody>
{% for item in dataset %}
<tr>
<td>
Item-Name
</td>
</tr>
{% endfor %}
</tobdy>
Now I want to transfer the id and - let's say - the name! Is something like this even possible?
<tbody>
{% for item in dataset %}
<tr>
<td>
Item-Name
</td>
</tr>
{% endfor %}
</tobdy>
And if it's possible, do I have to chage something inside my urls.py? Right now it's looking like this:
path('index/<str:pk>', views.example, name="Example"),
Thanks for all your help and a great day!
Your url should be
{% url 'Examplepage' id=item.id name=item.name %}"
And your path should be
path('index/<str:id>/<str:name>/', views.example, name="Example"),
There is a char field named json_field in Django Model. I am trying to iterate it from the view but it returns only one result as the return statement does. I am trying to figure it out how I can iterate json_field using yield.
the result that Model Object returns like:
id : 1
title : "Some Title"
json_field : [{"key":"value","key2":"value2"},{"key":"value","key2":"value2"}]
created : "Sat Oct 21 2017 14:00:53 GMT+0300 (+03)"
view.py
import json
def MyView(request):
model_query = MyModel.objects.all() or MyModel.objects.filter or exclude...
for item in model_query:
data_item = json.loads(item.json_field)
template = "template.html"
context = {"title":title, "data_item":data_item}
return render(request, template, context)
in template.html
{% for query_item in model_query %}
<table>
<thead>
<tr>
<th>{{ query_item.title }} - {{ query_item.created }}</th>
</tr>
</thead>
<tbody>
<tr>
<th>Some Heading </th>
<th>Some Heading </th>
</tr>
<!-- json data -->
{% for item in data_item %}
<tr>
<th>{{ item.key }}</th>
<td>{{ item.key2|floatformat:2 }}</td>
</tr>
{% endfor %}
<!-- json data -->
</thead>
</table><
{% endfor %}
Any help will be appreciated.
You can prepare dataset for you template.
# Fetch data from db as queryset of dicts
items = list(MyModel.objects.filter().values('title', 'created', 'json_field'))
# Decode json in-place
for item in items:
item['json_field'] = json.loads(item['json_field'])
context = {"title":title, "items": items}
Then interate through items inside your template:
{% for item in items %}
<table>
<thead>
<tr>
<th>{{ item.title }} - {{ item.created }}</th>
</tr>
</thead>
<tbody>
<tr>
<th>Some Heading </th>
<th>Some Heading </th>
</tr>
<!-- json data -->
{% for entry in item.json_field %}
<tr>
<th>{{ entry.key }}</th>
<td>{{ entry.key2|floatformat:2 }}</td>
</tr>
{% endfor %}
<!-- json data -->
</thead>
</table><
{% endfor %}
If you're using PostgreSQL, you can using JSONField. It uses the postgres's jsonb type, which is optimized for keeping a json serializable text.
If not, you still can use django-jsonfield. It almost gives the same functionality, even though some of the cool features of django's JSONField are not available (like this kind of lookups).
If none of these work for you, you can also implement your own JSONField by inheriting from CharField or TextField, and overriding some of the functions. This way, you won't need any of the logics of your field in your views.
Edit:
If you find changing your field hard or don't wanna do it for whatever reason, you can do this in your view:
for item in model_query:
item.loaded_json = json.loads(item.json_field)
then you can use it like a normal field in your template:
{% for query_item in model_query %}
{% for item in query_item.loaded_json %}
<span>{{ item.key }}</spam>
{% endfor %}
{% endfor %}
Hello!
The solution depends on your purposes.
Use comprehensions if you want to construct a list of json arrays:
data_items = [json.loads(item.json_field) for item in model_query]
... or generator of json array:
data_items = (json.loads(item.json_field) for item in model_query)
If you want to have a single array of json objects try this:
data_items = []
for item in model_query:
data_items.extend(json.loads(item.json_field))
Then you can use data_items as a template context.
A little tip: You can utilize JSONField at ORM level if you use PostgreSQL or MySQL. Consider this approach if you plan to make any filter queries on this field. As additional benefit JSON encoding/decoding will be out of box.
Thanks for updating your code!
Now I would restructure the json.load() list of dicts so you can use it. That is better style than mangling in the template.
concatenation is done by:
my_dict = dict()
for d in data_item
my_dict.update( d )
if you want to merge, check this thread:
How to merge two dictionaries in a single expression?
Goal: {% for loop %} over a list (using Jinja2) and then print out results {{print}} in a HTML table using Bootstrap.
Problem: List is not printing in the template.
In the view_config, I used query .all() to return a list of all the assessment_results objects. They are returning... I confirmed this via terminal/print debugging. However, the for loop is not returning the values needed to populate a table; as read in Jinja2 tutorial. I don't think I need to use a for loop in the view_config as I have seen others do (see here), but I am new to this and am trying to figure out how these two programs (SQLALCHEMY and Jinja2) interact.
An example from the printout after using .all() mentioned above:
[<Assessment_Result(owner='<User(username ='baseball', firstname ='Jen', lastname ='See', email='girl#aol.com')>', assessment='<Assessment(name='Becoming a Leader', text='better decisions')>')>]
view_config code:
views.py
#view_config(route_name='assessment_results', request_method='GET', renderer='templates/assessment_results.jinja2')
def all_assessment_results(request):
with transaction.manager: # < --- THIS WAS THE ISSUE !
assessment_results = api.retrieve_assessment_results()
if not assessment_results:
raise HTTPNotFound()
return {'assessment_results': assessment_results}
Corresponding Jinja2 template using Bootstrap:
assessment_results.jinja2
<div class="container">
<table class="table table-hover">
<thead>
<tr>
<td> Assessment ID </td>
<td> Assessment </td>
<td> Owner </td>
</tr>
</thead>
<tbody>
<tr>
{% for x in assessment_results %}
<td>{{ x.assessments|e }}</td>
<td>{{ x.owners|e}}</td>
{% else %}
<td><em>no users found</em></td>
{% endfor %}
</tr>
</tbody>
</table>
</div>
You should look at the documentation
http://jinja.pocoo.org/docs/dev/templates/#for
You want to iterate over a dict, so consider using iteritems, itervalues or what ever you want.
Also note that your query will not return a dict, it will return a list or rows that matched.
I am also not sure if the for-else works in jinja. But you should avoid using that anyways.
My issue is that I can't seem to translate the dictionary into a table here's the error:
Could not parse ["appid"] from 'game[''appid"]
HTML code:
<table>
<tr>
<th>Game ID</th>
<th>Game Name</th>
<th>Hours Played</th>
</tr>
{% for game in games %}
{# each game object is a dictionary with "appid", "name " and "playtime_forever" keys #}
<tr>
<td>{{ game["appid"] }}</td>
<td>{{game["name"]}}</td>
<td>{{ game["playtime_forever"] }}</td>
</tr>
</table>
views.py code:
~~~~ There's stuff here but it shouldn't be important. ~~~~
return render(request,'hackathon/SteamAPI.html', game)
When I run the server it shows:
game:
[{u'appid': 4000,
u'has_community_visible_stats': True,
u'img_icon_url': u'd9101cbeddcc4ff06c7fa1936c3f381b0bbf2e92',
u'img_logo_url': u'dca12980667e32ab072d79f5dbe91884056a03a2',
u'name': u"Garry's Mod",
u'playtime_forever': 0},
Django templates do not support [] indexing. Instead of
game["appid"]
you should use
game.appid
The same applies for game.name and game.playtime_forever
As an unrelated note, you should also close your for loop:
</tr>
{% endfor %}
</table>
Dictionary should be accessed this way in Django Templates.
choices = {'key1':'val1', 'key2':'val2'}
<ul>
{% for key, value in choices.items %}
<li>{{key}} - {{value}}</li>
{% endfor %}
</ul>
In Django, I am trying to generate a table. The first column is a timestamp. The next 5 columns need to be filled with my data.
However, my data table has 5 entries for each related timestamp. How can I put this data into my table with the correct headers?
The data entries are all seperate objects within Django..
The table has multiple rows with each their own timestamp, and their 5 corresponding data entries.
Is it possible to make this in the template layer, or view layer?
<table class="table table-hover">
<tr>
<th>date</th>
{% for sensor in sensors %}
<th>{{ sensor }}</th>
{% endfor %}
<th>Link</th>
</tr>
{% for stamp in stamps %}
<tr>
<td>{{ stamp.stamp|date:"D d N H:i" }}</td>
<td>Bekijk Detail</td>
</tr>
{% endfor %}
</table>
Instead of handling all this really complicated data in Django's template layer, this ought to be solved using the viewlayer.
First you create a new array, and seed it's table headers
table = ["header 1", "header 2"]
For each individual row you will add your data. The data I requested as a single datetime, followed by measurements. This equated to the following code
for x in range(0, len(timestamps)):
table.append(timestamp)
for datapoint in data:
table.append(datapoint)
You can then iterate through it in django's template layer.
<table>
{% for row in table %}
<tr>
{% for item in row %}
<td>{{item}}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
You can add some custom if/else statements for headers and that kind of thing.