質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

ORM

ORM(オブジェクト関係マッピング)はオブジェクト指向のシステムとリレーショナルデータベースの間でマッピングを行う技術です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

4148閲覧

djangoで取得してきた数値を文字に変換してtemplatesに渡したい。

sususu

総合スコア99

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

ORM

ORM(オブジェクト関係マッピング)はオブジェクト指向のシステムとリレーショナルデータベースの間でマッピングを行う技術です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2019/08/18 07:45

編集2019/08/18 13:05

いつもお世話になっております。
表題の件の通りなのですが、データベースに数値で入っている値を取得して
viewsを通して文字列に変換したいです。

また入っている数値によって変換される文字列をif文で変更しようと思っております。

コードは下記のとおりです。
models.py

from django.db import models class Property(models.Model): title = models.CharField(max_length=50, blank=False) comment = models.CharField(max_length=300, blank=False) image = models.ImageField(upload_to = 'photos') vacant_day_num = models.PositiveSmallIntegerField(blank=False) place = models.CharField(max_length=50, blank=False) price = models.PositiveSmallIntegerField(blank=False) create_date = models.DateTimeField(auto_now=True) def __str__(self): return self.title

views.py

from django.shortcuts import render, get_object_or_404 from django.contrib.auth.models import User from .models import Property import logging def index(request): propertys = Property.objects.all().order_by('-create_date') for property in propertys: logging.debug(property.vacant_day_num) if property['vacant_day_num'] = 3: property['vacant_day'] = '月、火' else: return render(request, 'mutual/index.html',{'propertys': propertys})

上記のfor分の箇所を色々やってみたのですが、わかりませんでした。
伝わるかわかりませんが一応PHPの感じで記載しておきました。

vacant_day_numが3だったらvacant_dayに「月、火」を入れてpropertysに戻してあげたいです。

python,djangoを始めたばかりで戸惑っております。
どなたかご教授いただけると幸いです。
ご回答の程よろしくお願いいたします。

修正後

def index(request): propertys = Property.objects.all().order_by('-create_date') for property in propertys: if property.vacant_day_num == 3: logging.debug('num is 3') setattr(property, 'vacant_day','月、火') logging.debug(property.vacant_day) elif property.vacant_day_num == 96: logging.debug('num is 96') setattr(property, 'vacant_day','月、火、水、木、金、土、日') logging.debug(property.vacant_day) return render(request, 'mutual/index.html',{'propertys': propertys})

modelを修正

from django.db import models class Property(models.Model): title = models.CharField(max_length=50, blank=False) comment = models.CharField(max_length=300, blank=False) image = models.ImageField(upload_to = 'photos') vacant_day_num = models.PositiveSmallIntegerField(blank=False) place = models.CharField(max_length=50, blank=False) price = models.PositiveSmallIntegerField(blank=False) create_date = models.DateTimeField(auto_now=True) def get_vacant_day(self) -> str: if self.vacant_day_num == 3: return '月、火' elif self.vacant_day_num == 96: return '月、火、水、木、金、土、日' def __str__(self): return self.title

viewを修正(コメントアウト)

def index(request): propertys = Property.objects.all().order_by('-create_date') logging.debug(property.vacant_day) """ for property in propertys: setattr(property, 'vacant_day','') if property.vacant_day_num == 3: setattr(property, 'vacant_day','月、火') property_list.append(property.vacant_day) logging.debug(property.vacant_day) elif property.vacant_day_num == 96: setattr(property, 'vacant_day','月、火、水、木、金、土、日') property_list.append(property.vacant_day) logging.debug(property.vacant_day) """ return render(request, 'mutual/index.html',{'propertys': propertys})

template

{% extends 'mutual/base.html' %} {% block content %} <h2>トップページ</h2> {% for property in propertys %} <table> <tr> <td rowspan="4"><img src="{{property.image.url}}" class="photo-img"></td> <td>物件名</td> <td>{{property.title}}</td> <tr> <td>曜日</td> <td>{{property.vacantn_day}}</td> </tr> <tr> <td>場所</td> <td>{{property.place}}</td> </tr> <tr> <td>金額</td> <td>{{property.price}}</td> </tr> <tr> <td colspan="3">{{property.comment}}</td> </tr> </table> {% endfor %} {% endblock %}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2019/08/18 09:52

実行するとどうなりますか?
sususu

2019/08/18 11:15

コメントありがとうございます。 外出していて遅れてしまい申し訳ございません。 エラーは下記の通りです。 Exception Type: TypeError Exception Value: 'Property' object does not support item assignment エラーの行を確認するとやはりviews.pu の property['vacant_day'] = '月、火'がyくないみたいです。
meg_

2019/08/18 11:23

まず「if property['vacant_day_num'] = 3:」は「if property['vacant_day_num'] == 3:」が正しいと思うのですが、コピペミスですか?
meg_

2019/08/18 11:32

「property」の型は何でしょうか?
sususu

2019/08/18 11:51

すいませんif文はミスでした。 型は宣言していないのんですが、今調べてみます。 一応コードを修正したら思った通りに値は入ってきましたが、 templates側で表示ができません。 ※修正コードは質問文に追記させていただきました。 原因はpropertyに新しい値vacant_dayを入れた後propertysに入れていないからなのですが、入れ方がわかりません…ORMの書き方があるのでしょうか?
meg_

2019/08/18 12:00

型は「QuerySet」でしょう。もしかしたらpropertysがちゃんと取得できていないのでは?と思ったのですが、その後値の代入まで出来たとのことなので問題ないですね。失礼しました。
sususu

2019/08/18 12:10

QuerySetというのは型だったのですね。ありがとうございます。勉強になります。 引き続き調べてみます。
guest

回答2

0

ベストアンサー

大分凝ったことやっているので、自信はないですがpropertysはQuerySetなので、forで回した時のpropertyと、renderで使う時のpropertysから出てくるpropertyは違う可能性があるかもしれません。。。
つまり、renderで使う時のpropertysから出てくるpropertyはまた新しく作られたものにるかもということです。

回答から外れてしまいますが、正直いうと、この設計はあまりよくないです。
この処理はPropertyモデルのvacant_day_numを見て、機械が扱う数値から人間が読める曜日に直しているわけですよね。
で、明らかにViewが持つべき処理ではない。Modelがやるべきです。

Propertyモデルにget_vacant_day関数でも用意して、template内でその関数を呼んであげるのがいいと思います。

python

1from django.db import models 2 3class Property(models.Model): 4 title = models.CharField(max_length=50, blank=False) 5 comment = models.CharField(max_length=300, blank=False) 6 image = models.ImageField(upload_to = 'photos') 7 vacant_day_num = models.PositiveSmallIntegerField(blank=False) 8 place = models.CharField(max_length=50, blank=False) 9 price = models.PositiveSmallIntegerField(blank=False) 10 create_date = models.DateTimeField(auto_now=True) 11 12 def get_vacant_day(self) -> str: 13 if self.vacant_day_num == 3: 14 return '月、火' 15 elif self.vacant_day_num == 96: 16 return '月、火、水、木、金、土、日' 17 18 def __str__(self): 19 return self.title

投稿2019/08/18 12:24

編集2019/08/18 12:27
wintermaples

総合スコア116

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sususu

2019/08/18 13:01

コメントありがとうございます。 まだmodelとviewの役割が分かっておらず勉強不足でした。 上記の通りにmodelに追記したのですが、viewでログを出そうとすると下記のエラーが出てしまいます。 type object 'property' has no attribute 'vacant_day' 何か足りない部分がありますでしょうか。 修正後のmodels、view、templateは質問文に追記させていただきます。 ※設計の件ご指摘ありがとうございます。これが解決したら素直に文字列を入れるようにしようと思います。ありがとうございます。
wintermaples

2019/08/18 13:07

property.vacant_dayはセットしていないので存在しないです。 model内に、vacant_dayの代わりにget_vacant_day(self)を作ったのですから、 logging.debug(property.get_vacant_day())とするのが正しいです。 あと、templateのほうも同じようにしないといけませんね。
sususu

2019/08/18 13:29

ありがとうございます! 曜日が表示されるように出来ました! まだ仕組みが良く理解できていないので勉強しなおします。 また設計の方もやり直したいと思います。 ありがとうございました!
guest

0

Djangoのことは詳しくないのですが下記で出来ないでしょうか?

Python

1propertys = Property.objects.all().order_by('-create_date') 2 for property in propertys: 3 if property.vacant_day_num == 3: 4 property.vacant_day = '月、火' 5 property.save() #ここは自信ないですが.... 6

投稿2019/08/18 11:56

meg_

総合スコア10579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sususu

2019/08/18 12:13

コメントありがとうございます。 やってみたのですが、できませんでした。 調べてみたら、save()はデータベースに保存する時のような意味合いで書いてありました。 現状質問文に追記させていただいた通りsettatrを使用したら値は入れる事ができました。 しかしpropertysに値が入っていかないのでtemplatesで表示できない状況です。 引き続き調査してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問