フリースペース

2018-10-04 / お知らせ

フリースペースです。

旧ブログの記事で質問があったり、特定の記事に紐づかないコメントはこちらのコメント欄に書き込んでください。

この記事の関連記事

関連記事はありません。

コメント欄

記事にコメントする

名無し

いつもブログ拝読しています。 フィードを登録しようとするとエラーになってしまいます。nginxの設定でhttpからhttpsへのリダイレクトがなされていないように見えます。お手数ですがご対応お願いいたします。

コメントに返信する

なりと

ご連絡ありがとうございます。

リダイレクト設定をしました。

名無し

いつも拝見しております。 新しいブログの記事も楽しみにしています!

と言いつつ…旧ブログの記事で質問です。ManyToManyを使った自分自身へのリレーションで、記事ではform.pyの中でexcludeで自分自身を除外していたと思いますが、DetailViewやtemplateの中で自分自身を除外する場合はどのようにするとよいでしょうか。

コメントに返信する

なりと

詳細画面を開いた際に、ManyToMany(self)で紐づいたデータを表示したいが、その自分自身は除きたいということでしょうか。

その場合は、モデルのメソッドとして定義してしまうのが簡単だと思います。

class Post(models.Model):
    """ブログのポスト"""

    title = models.CharField("タイトル", max_length=255)
    text = models.TextField("中身")
    friend_posts = models.ManyToManyField("self", verbose_name="関連記事", blank=True)

    def __str__(self):
        return self.title

    def get_friends(self):
        return Post.objects.exclude(pk=self.pk)

テンプレートでは、{% for f_post in post.get_friends %} のように呼び出せます。

名無し

ありがとうございます! ご回答いただいた通りの内容の質問でした。とても参考になりました。

Markdown記法でコメント入れられるのも便利だなーと思いました。

ありがとうございました。

なりと

上のコードだとすべての記事(自分以外)が表示されます。

ManyToMany(self)で紐づいたもので、自分自身を除く場合(なので、自分自身も既に紐づいている場合)は以下のようにできます。

    def get_friends(self):
        return self.friend_posts.exclude(pk=self.pk)
名無し

ありがとうございます。

選択していないすべての記事が表示されてしまっていたのでとても助かりました。ありがとうございました。

生徒

お世話になっております。 新ブログ完成おめでとうございます! 楽しみにしていました。

誠に恐れりいます、早速ですが質問させて下さい。

現在、私はnaritoさんのumedyの講義を拝見しながら、 さくらのVPS(centOS+nginx)にdjango製の自分のwebサービスをデプロイすることが出来ました(ありがとうございます!)。

これから行いたい事として、 このサーバー内に既存のwordpressサイトをdjangoと共存させる形で移管したいです。 しかし、このwordpressの適切な移管場所が分かりません。

wordpressの移管についてweb上の記事で調べると、

「wordpress本体はドキュメントルート(/usr/share/nginx/html)にアップロードする」

という内容が散見されるのですが、現在、djangoはhomeディレクトリにアップロードされています。

djangoはhomeディレクトリにアップロードされているのに、wordpressだけ上記のドキュメントルートにアップロードするというのはおかしいのではないかと考えています。

上記を踏まえて質問致します。

  1. 私のケースのように、djangoとwordpressを一つのVPSの中に入れることは可能でしょうか。
  2. 上記1が可能である場合、wordpressを格納するフォルダはどこが良いのでしょうか。homeの中にwordpressファイルを入れることは可能でしょうか。

コメントに返信する

なりと
  1. 可能です。

  2. ドキュメントルートで問題ございません。
    ドキュメントルートにhtmlファイルを置くだけで大抵のウェブサーバーではhttp://ドメイン/〇〇.html としてアクセスできますが、phpも似たようなことが簡単にできます(にわかPHP知識なので語弊があるかも)。なので、他の場所にwordpress関連ファイルをおこうとするとドキュメントルートの変更等が必要になります。

しかし、Pythonの場合はまたちょっと話は別です。公式サイトから抜粋します。

コードはどこに置くの?

(モダンなフレームワークを使わない) 古いプレーンな PHP の経験があるなら、これまでは Web サーバのドキュメントルート下 (/var/www といった場所) にコードを配置してきたことでしょう。 Django ではそうしないでください。 Python コードを Web サーバーのドキュメントルート下に置かないでください。コードをドキュメントルート下に置くと、 誰かがコードを Web を介して読めるようになってしまうからです。これは安全上良くありません。

コードはドキュメントルートの外、例えば /home/mycode の ような場所に置きましょう。

ですので、今回の例ならばwordpress関連はドキュメントルート(/usr/share/nginx/html)に、Django関連は/home にというのはおかしくなく、自然な対応です。

生徒

なるほど、完璧に理解できました。 誠に有難うございます!

名無し

いつも拝見しております。恐れ入りますが、一つ質問がございます。

djangoで管理台帳を作成しています。 クラスAとクラスBがあり、クラスBにはForeignKeyでクラスAを保持しております。クラスAには台帳のメタデータ的な情報(例えば'開始日'と'回数'など。)を持たせて置き、その情報をもとにしてpandasのDataFrameで計算を回し、その計算の結果、複数のクラスBインスタンスが作成される、というイメージを持っております。

その場合、計算を回す関数はクラスAのmodels.pyに持たせておくのが自然でしょうか。

また、クラスAのインスタンスがデータベースにsaveされた瞬間に、計算の関数が呼び出され、自動的にクラスBのインスタンスが作成されてデータベースに保存されるようにすることは可能でしょうか。(クラスAのデータが削除された場合、クラスAの情報で作成されたクラスBのデータも削除される必要がある。)

この場合、クラスAの修正や削除がそれなりの回数発生するとした場合、データベースへのアクセス回数など、プログラムに負担がかかってしまうものなのかと、いろいろ気になりましたが、一般的な考え方はありますでしょうか。

宜しくお願いいたします。。

コメントに返信する

Uichi

旧ブログDjangoで、汎用ビュー(ListView, DetailView)の 以下の部分ですが、

class IndexViepw(generic.ListView):
    queryset = Post.objects.all()

IndexViepw ではなく IndexViewではないでしょうか。

細かくてすいませんが、よろしくおねがいします。

なりと

その場合、計算を回す関数はクラスAのmodels.pyに持たせておくのが自然でしょうか。

ビューは見通しをよくするのが良いとよく言われます。ただ、個人的にはビューで一度書いてみて、見通しが悪くなったり、他のビューでも同じコードが必要になりそうならモデル(又はフォーム)に定義する、といった感じで良いと思います。

また、クラスAのインスタンスがデータベースにsaveされた瞬間に、計算の関数が呼び出され、

このケースならシグナルを使うのがスムーズだと思います。

from django.db.models.signals import post_save
from django.dispatch import receiver
...
...
@receiver(post_save, sender=ModelA)
def create_model_b(sender, instance, created, **kwargs):
    # 更新ではなく新規作成された場合にこのフラグが使えます。
    if created:
        # 計算とモデルBの作成処理
        # instance引数に、モデルAインスタンスが入っています。

post_saveはsaveメソッドの後に呼ばれます。pre_saveや、削除処理の前後で使えるpre_delete, post_deleteもあります。 ドキュメント

この場合、クラスAの修正や削除がそれなりの回数発生するとした場合、データベースへのアクセス回数など、プログラムに負担がかかってしまうものなのかと、いろいろ気になりましたが

数件、数十件程度ならそこまで気にしなくてもよいと思いますが、気になる場合はbulk_create()のような一括作成に特化したものもあるので、そちらの利用を検討してください。

なりと

Uichi さん
IndexView が正しいです。わざわざのご連絡ありがとうございます。

名無し

ありがとうございます。

ビューとモデルの考え方、シグナル、データベースのご回答内容大変参考になりました。

早速シグナルで試してみたところ、うまくいきました。ビューがかなり見通し悪くなってきたので、モデルに移そうかと考え始めました。

いつもいつも、非常に助かっております。ありがとうございました。

ninjaのドメイン、いいですね(^^)

名無し

ブログの記事をいつも参考にさせていただいております。最近Djangoを始めたはじめたばかりで、分からないことが多いのですが、まずはブログを作りながら勉強しようかなと、思っています。

Djangoのクラス汎用ビューを使いながら作成していると、文章と画像が混在した内容を作成したい時に「はて?」となってしまいました。

例えば、ブログ記事の詳細ページをdetail.htmlとした時に、そのページ内では、detai.htmlに記載した一律の表示の仕方しか出来ず、画像などを記事毎に好きな位置に配置するということはできないように思います。

テキストだけなら、モデルで定義したフィールドに格納し、記事ごとにfor文で取り出せばいいだけだと思いますが、画像が入るとそうもいきません。

こういう場合は、記事ごとの詳細ページ毎にhtmlファイルを作成する必要があるのでしょうか?

そうするとブログを更新するたびにいちいちデプロイする必要があり、できればDjangoの管理画面から画像データと文章が混在した記事投稿が可能にならないかなと思ってますが、可能でしょうか?

ちなみにnarito様のブログではどのように記事更新をされているか参考にさせていただけないでしょうか?

よろしくお願いいたします。

コメントに返信する

なりと

このブログでは、次のように記事の本文が書かれています。Postモデルのtextというフィールドです。

## 概要
Djangoのメッセージフレームワークの簡単なサンプルです。BulmaのNotificationやMessageを使った表示もしていきます。

データの作成や更新、削除をすると、次のように上側にフラッシュメッセージが表示されます。

![メッセージが表示される](https://user-images.githubusercontent.com/28292340/50723959-aec4ae00-1128-11e9-9e29-8f7c8cfd14dc.gif)

これは各ユーザーに向けた一過性の通知メッセージで、1度表示されたら消去されます。

## Github
少し長めなので、Github
(以下省略)

おっしゃるように、現実のブログでは本文の中にリンクや画像、場合によっては複雑なHTMLも書かれます。なので、記事の本文にはHTMLに変換される前提の、あるルールを持った文章を書くことが多いです。上の例ならば、##はh2といった見出しに変換されますし、![]()部分は<img>として画像に変換されます。その変換作業はテンプレートフィルタであったり、モデルのメソッドとしてよく行います。ちなみに、上の文章はマークダウンというルールで書いています。

旧ブログでは、次のようにしていました。

画像です。
[filter img]https://torina.top/media/380/c.png[end]

[filter img]部分が<img>要素になって画像となるのですが、マークダウンのほうが一般的だし分かりやすいということで、今は使っていません。ただ、こんな感じで文章を書いておき、フィルタ等でそれをHTMLに変換すると、本文の中に文章や画像を混在させれます。

他にあるのは、直接HTMLを記入させて表示するような例です。

<h2>概要</h2>
<p>Djangoのメッセージフレームワークの簡単なサンプルです...

<img src="https:...."

文章の作成や更新が面倒になりやすいのであまり好まれませんが、ページの表示が記事毎に違いすぎるような場合等には使うことになります。マークダウンは直接HTMLを書くこともできるので、マークダウンそのままでは表現できない見た目の部分だけ直接HTMLで描く、といったこともあります。

名無し

ご返信ありがとうございます。 マークダウン記法というのがあるのですね。 ご提示いただいた例では、Git上の画像ファイルを参照されているようですが、Git上で画像データを管理してマークダウンで参照するというのが一般的なのでしょうか?

なりと

基本的には自分のサーバーであったり、配信専用のサーバーにアップロードします。

私が使っているツール(django-markdownx)的にGIFファイルのアップロードが上手くできず面倒なので、GIF置き場としてGithubを利用しているだけです。

名無し

ご返信ありがとうございます! こちらの記事を参考にさせていただき、勉強したいと思います(https://narito.ninja/detail/102/)

新米エンジニア

オンライン実行環境に興味があり、旧ブログ記事にたどり着いたですが 同じようにしても TemplateDoesNotExist at / とエラーが表示されてしまいます....

templateフォルダを作らないとダメなのでしょうか?

どうエラーが出たのかさえまだ上手く伝えられませんが、何かヒントを頂けますと幸いです。

お手数おかけしますがよろしくお願いいたします。

コメントに返信する

新米エンジニア

すみません、こちらtemplatesフォルダを作成したところできました! 無知でお騒がせしました。

ありがとうございます!

名無し

こんばんは、質問させていただきます。 複数人で管理運営するブログをdjangoで作っています。 adminページに記事の一覧があり、それとManyToManyでUserを紐づかせたいと思っています。つまりはadminページに自作のactionを追加したいのですが、特定のフィールドをqueryset.update(name="aaa")のようにupdateで追加する方法はわかるのですが、ManyToManyをいじる方法がわかりません。 教えていただけたら嬉しいです。

コメントに返信する

なりと

次のような感じで良いと思います。

def my_action(modeladmin, request, queryset):
    new_tag = Tag.objects.get(name='人気')
    for post in queryset:
        post.tags.add(new_tag)
名無し

この方法で登録してみましたが、アクションが表示されませんでした。

なりと
from django.contrib import admin
from .models import *


def my_action(modeladmin, request, queryset):
    new_tag = Tag.objects.get(name='人気')
    for post in queryset:
        post.tags.add(new_tag)


class PostAdmin(admin.ModelAdmin):
    actions = [my_action]

admin.site.register(Post, PostAdmin)
admin.site.register(Tag)

名無し

うまくいきました。ありがとうございました。

名無し

はじめまして、ひとつDjangoに関する質問をさせてほしくてコメントさせていただきました。 私はEC2のインスタンスにNginxを導入し、そこから静的ファイルを配信しているのですが、保存はインスタンスに行っています。 ただ、S3というものを聞いたことがあって興味があるのですが、大量の画像をアプリにアップロードする場合、そういったものを使ったほうがメリットがあるのでしょうか?

コメントに返信する

なりと

こちらにわかりやすい解説がありました。

本当に大量の画像などを扱うならばS3を使っても良いと思います。ただ場合によっては料金もかかってきますし、EC2上のDjangoとS3でやり取りする必要があるので少し複雑にもなります。

名無し

ありがとうございます! 設定は難しそうですがやってみようと思います。

名無し

いつもブログ拝読しています。私もNarito Blogを参考にブログを作りたいと思っているのですが、画像の添付をどうやるのかがわかりません。どうやればいいのでしょうか?

コメントに返信する

なりと

記事のテキストをどうやって書いているかによりますが、記事内のテキストには画像のURLだけ張れば済むようにすると楽です。

具体的には、https://...jpg のようなURLを文章中に張り付けると、そこが画像になるように作ると楽です。モデルのメソッドやテンプレートフィルタで、そういった部分を<img src="https://....jpg">に変換します。

自分で作ると面倒なので、django-markdownxのようなテキストエディタをDjangoに導入するのがオススメです。こういったテキストエディタは多くの場合、ドラッグ&ドロップで画像を本文に挿入できます。

名無し

こんばんは、いつもこのサイトを手本にさせていただいています。ひとつ不思議なエラーを発見したので、質問させていただきます。 DjangoのModelForm内において、clean_tmpvideoというvideoフィールドのクリーンメソッドを定義しました。コードは以下の通りです。

    def clean_tmpvideo(self):
        tmpvideo = self.cleaned_data['tmpvideo']
        if tmpvideo:
            if tmpvideo.size > 5242880:
                print("sizeをが大きすぎます")
                print("sizeはこれです{}".format(tmpvideo.size))
                raise forms.ValidationError(_("動画のサイズが大きすぎます。動画は5MB以下にしなければいけません。"))
            print("サイズは大丈夫です")
            print("sizeはこれです{}".format(tmpvideo.size))
            return tmpvideo

これは開発環境ではうまく機能し、大きいファイルは送信したとたんにバリデーションエラーを出されて元のページに戻されていたのですが、本番環境では長い時間アップロード処理を行った後、おそらくはsettings.py内の最大サイズ制限により送信に失敗します。つまりバリデーションの段階で防ぐことができていません。 考えられる原因などあるでしょうか?

ちなみに本番環境では動画をS3にアップロードするように設定しており、データベースはPostgreSQLに変えています。このあたりが関係しているのかもしれません。

コメントに返信する

名無し

自己解決しました。

名無し196

はじめましてですsublime text3に関する質問をさせてほしくてコメントさせていただきました naritoさんのブログを見ながらsublime text3をインストールをして進めていたのですが sublimeREPLを導入して手順通り進めてCtrl + Bをしてみたのですが

[WinError 2] 指定されたファイルが見つかりません。 [cmd: ['c:/Python37/python.exe', '-u', 'C:\Users\Mulie\AppData\Roaming\Sublime Text 3\Packages\User\python37.sublime-build']] [dir: C:\Users\Mulie\AppData\Roaming\Sublime Text 3\Packages\User] [path: C:\Program Files (x86)\Intel\TXE Components\iCLS\;C:\Program Files\Intel\TXE Components\iCLS\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\TXE Components\DAL\;C:\Program Files (x86)\Intel\TXE Components\DAL\;C:\Program Files\Intel\TXE Components\IPT\;C:\Program Files (x86)\Intel\TXE Components\IPT\;C:\WINDOWS\System32\OpenSSH\;C:\Users\Mulie\AppData\Local\Microsoft\WindowsApps;] [Finished]

とでて進めないのですがなにが原因でしょうか ご迷惑をおかけしますがよろしくお願いします

コメントに返信する

なりと

私のサンプルコードでは"cmd": ["c:/Python34/python.exe", "-u", "$file"],としていますが、これはCドライブ直下にPython34ディレクトリがあり、その中にpython.exeがある場合の例です。

python3.7をインストールした場所を指定するようにしてください。

名無し196

出来ました! 丁寧な返信ありがとうございました!

矢吹

こんにちは。Djangoでブログアプリを作る良いドキュメントって意外と少なく、いつもこのブログを拝見しています。 早速ですが質問です。

ブログではタグと記事をManyToManyフィールドで接続しています。この度、とあるタグが含まれる記事を一覧表示したいと考えました。(イメージとしてはタグを開くとそのタグが含まれる記事が一覧表示される)

https://narito.ninja/blog/detail/106/ こちらの記事を参考に作らせていただいているのですが、難しいです。ご教授よろしくお願いします。

コメントに返信する

なりと

ある特定のタグに属する全ての記事を取得するビューは、例えば次のようになります。

class PostListFilterTag(generic.ListView):
    model = Post  # 記事モデル

    def get_queryset(self):
        # 記事の一覧を取得
        queryset = super().get_queryset()

        # クリックされたタグを取得し、そのタグで記事を絞り込む
        tag = get_object_or_404(Tag, pk=self.kwagrs['pk'])
        queryset = queryset.filter(tag=tag)

        return queryset

このビューはURL内にタグのpkをもらう必要があるので、urls.pyは例えば次のような定義になります。

path('posts/tag/<int:pk>/', views.PostListFilterTag.as_view(), name='post_list_tag'),

このようにurls.pyを定義したので、テンプレートファイルでは次のようにタグをa要素で囲めば、タグをクリックした際にそのタグに属する記事の一覧が取得できます。

{% for tag in tag_list %}
<a href="{% url 'app:post_list_tag' tag.pk %}">{{ tag.name }}</a>
{% endfor %}
矢吹

なりと さん

ありがとうございます。無事できました。

名無し

いつも参考にさせていただいています。 https://github.com/naritotakizawa/django-torina-blog

上記Gitのdjango-torina-blog(安定版)を以下の環境で導入したのですが、1点動作上の問題があります。

OS:Windows環境 WEBサーバ:IIS Python:3.6 Django:2.1

①adminサイト上で、Categorysに「AI、ビジネス」の2つを登録します。    ※日本語のエントリーとアルファベットのエントリーを登録

②ブログトップ画面で、画面右側に表示される「All Category」欄に表示されているカテゴリ「AIとビジネス」をそれぞれクリックすると 以下の通り日本語だけ画面遷移に失敗します。

AI →http://<サーバ名>/category/AI/に遷移して問題なく画面表示される。

ビジネス→以下のエラーが発生する。 ※遷移した見た目のURLは以下のようになっています。 http://<サーバ名>/category/ビジネス/

→URLパターン末尾の部分(日本語)が文字化けしているため画面遷移に失敗しているような感じですが、エラーを解消する手段はありますでしょうか?  なお、同様のエラーはTagsに日本語のエントリーを登録した場合も画面遷移時に発生します。

DoesNotExist at /category/%83r%83W%83l%83X/   Category matching query does not exist. Request Method: GET Request URL: http://<サーバ名>/category/%2583r%2583W%2583l%2583X/ Django Version: 2.1 Exception Type: DoesNotExist Exception Value:
Category matching query does not exist. Exception Location: c:\app\anaconda3\lib\site-packages\django\db\models\query.py in get, line 399 Python Executable: c:\app\anaconda3\python.exe Python Version: 3.6.5 Python Path:
['.', 'c:\app\anaconda3\python36.zip', 'c:\app\anaconda3\DLLs', 'c:\app\anaconda3\lib', 'c:\app\anaconda3', 'c:\app\anaconda3\lib\site-packages', 'c:\app\anaconda3\lib\site-packages\win32', 'c:\app\anaconda3\lib\site-packages\win32\lib', 'c:\app\anaconda3\lib\site-packages\Pythonwin', ]

コメントに返信する

名無し

補足させていただきます。

恐らく、例えばviews.pyのCategoryViewクラス内でCategoryテーブルからobjects.getするときに name=category_nameの部分でcategory_nameの値としてURLエンコードされた値(例:%83r%83W%83l)がそのままセットされていて、 そんな名称のレコードはないと怒られているようです・・ デバッグログを見ると、category_nameには「'%83r%83W%83l'」といった値が入ってきていました。

class CategoryView(BaseListView): """カテゴリのリンククリック"""

def get_queryset(self):
    """カテゴリでの絞り込み"""
    category_name = self.kwargs['category']
    self.category = Category.objects.get(name=category_name)
    queryset = super().get_queryset().filter(category=self.category)
    return queryset
名無し

さらに補足させていただきます。 こちらで調査した結果、以下のところまでわかりましたが根本原因は不明な状態です。。

<例>
カテゴリ名="ビジネス" →これをURLエンコードしたものは「%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9」

トレースのWSGIRequestを見ると以下の通り「%2583r%2583W%2583l%2583X/」になっている。

-------------------------------------------- WSGIRequest: GET '/blogcategory/%2583r%2583W%2583l%2583X/' --------------------------------------------

「"%2583r%2583W%2583l%2583X"」をURLでコードすると「"%83r%83W%83l%83X"」になり、冒頭のエラーメッセージ「DoesNotExist at /blogcategory/%83r%83W%83l%83X/」と同じ URLパスになる。

上記から、WSGIRequest: GET時点でURLエンコード情報が欠落している?様な感じのようです・・・

なりと

DjangoやPythonというよりも、IIS側の問題と思われます。次のページを参考にしてみてください。

http://surferonwww.info/BlogEngine/post/2013/12/02/iis-url-rewrite-2-module-cannot-rewrite-japanese-properly.aspx

名無し

naritoさん

ご回答ありがとうございます!

Djangoの開発サーバ経由だと問題なかったのでIISの問題であることは間違いないようです。 参考サイトを中心にIIS周りの設定情報を調査しつつ、いろいろと設定をいじってみましたがなかなか問題解消することができませんでした。 IISレイヤの設定変更での解決が難しそうだったので、アプローチ方法を変えました。

デバッグログをみると「kwargs={'category': '%83r%83W%83l%83X'}」のようにcategoryキーにShift-JISでURLエンコードされた値が セットされてしまっており、views.py(60行目)のCategory.objects.get(name=****)のところでURLエンコードされた情報をnameに指定して 検索処理を実行していることで今回のエラーが発生していたので・・・

    category_name = urllib.parse.unquote(category_name, encoding="shift-jis")
    self.category = Category.objects.get(name=category_name)

以下の通り、DB検索する前にURLデコードする処理を加えることで問題を回避することができました。

   #shift-jisでURLエンコーディングされてしまうのでデコードしてからobjects.get指せるように変更
          category_name = self.kwargs['category']
    category_name = urllib.parse.unquote(category_name, encoding="shift-jis")
    self.category = Category.objects.get(name=category_name)

無理やり観はありますが、動作上は問題ない状態です。

もし、naritoさんのほうでもより良い改善策が見つかりましたら共有いただけますと幸いです。

よろしくおねがいします

はじめまして

最近Webコーディングに興味を持ち こちらのブログに移行される前にnarito様が執筆された「DjangoとDockerを用いてオンライン実行環境を構築する」にたどり着きました 練習や要領をつかむため一つ一つ理解しながら進めていたのですが、躓いてしまったので質問させていただきます 理解が浅いため初歩的な質問であると思われます あらかじめ謝罪申し上げます

まずはDjango、Dockerとpython3.6イメージのダウンロードをすませコマンドプロンプトでのDocker runコマンドの出力に成功しました(main.py [Hello World!]) その後、実記ページの作成をしようと django-admin startproject Dockerでプロジェクトを作成したのち cd Docker、 python manage.py startapp appを実行しプロジェクト内にappを追加しました

その時のファイル構成が Docker_ app___migrations |Docker__pycache |__init.py |manage.py |__init.py |__admin.py |__settings.py |__apps.py |urls.py |__models.py |wsgi.py |__tests.py |__views.py

上の構成図です(runserver使用前)

docker/settings.pyやapp/views.pyなどのあらかじめ用意されたファイル等の修正箇所はブログにて記述されていた内容をそのまま写すような形で書き込み、 あらかじめ存在していないapp/forms.pyやapp/base.html・home.html等は右クリックでファイルごと追加するような形で増設しました しかしブログの最下におかれているapp/home.htmlの記述が終わったのち python manage.py runserverでサーバーを起動しようと試してみたところエラーが発生しました

OSError: [WinError 123] ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。: '<frozen importlib._bootstrap>'

今回の質問で私が気にしている内容は下図のような最終的なファイル構成で正しいのかどうか(runserver使用後) project作成コマンド(django-admin)やapp追加コマンド(startapp)で作成した工程が正しいのかといった二点です

Docker_ app___migrations |Docker__pycache |__init.py |manage.py |__init.py |admin.py |__db.sqlite3 |__settings.py |__apps.py |urls.py |__models.py |wsgi.py |__tests.py |__views.py |__pycache |__base.html |__forms.py |__home.html |__urls.py

お時間あるときで結構ですので教えていただけると幸いです。

コメントに返信する

名無し

すみません レイアウトが崩れていますね… 画像にて作りなおしてきます 申し訳ございません

名無し

上図(runserver使用前 project作成時)は こちら

下図(runserver使用後 最終フォルダ構成)は こちらです、お目汚し大変失礼いたしました。

名無し

すみません 画像の貼り付け方が分からないので直リンクにて失礼します

上図 https://imgur.com/5axSm7p

下図 https://imgur.com/g4jtofF

なりと

記事を旧ブログから新ブログに移行するついでに、書き直しました。DjangoとDockerで、オンライン実行環境を作る

ディレクトリ構成ですが、Githubにソースコードを置いたので、それを参考にしてみてください。

名無し

いつもブログ拝見させて頂いております。

早速質問なのですが、 フォームを利用してDBの情報更新を行う際、元データも過去のものとして残しておきたいので、元データのVersion情報をFalse、更新後のVerision情報をTrueとしてサイト上にはTrueのもののみ表示を行いたいのですが方法がわかりません。

教えて頂きたいです、宜しくお願い致します。

コメントに返信する

なりと

今できている部分だけでいいので、ソースコードの内容を教えてもらえますか。

名無し

なりと様

すみません、なんとか自分でできました。

もう一つ質問させて頂きたいです。 DB内に登録したデータを、「出力」ボタンを押すとexcel出力されるような機能を作成したいのですが、色々検索してもあまり情報が得られません。 データをexcelに出力方法を教えてほしいです。

宜しくお願い致します。

なりと

Djangoで、ファイルダウンロードのコメント欄でエクセル出力の方法について簡単に書いているので、そちらを参考にしてみてください。

名無し

なりと様

ご紹介ありがとうございます。 Excel出力機能を作成することができました。

続けて申し訳ありませんが再度質問したいことがあります。

現在、ガントチャートみたいなものを作成したく考えております。 イメージは写真のようなものです。 各作業のチェックシートのようなものを作成し、全てにチェックが入っていれば完了日の表示、チェックが入っていない項目が有れば未完の文字を表示し、その文字をリンク化してチェックシートにとべるようなものを作成したいです。

条件(チェックが全て入っているか)によって表示文字を変えたりすることはできるのでしょうか。 勉強不足で申し訳ないのですが、現状モデルの登録しかできていない状況です。

ご教授頂けると幸いです。

名無し

すみません。画像のアップがよくわかりませんでした。

https://imgur.com/ramfxXT

リンク先で見れます・・・。

なりと

models.pyの中身を教えてください。

名無し

モデルもこれでうまくいくのかよくわかりませんが、現状この様になっております。

from django.db import models
import datetime
from django.utils import timezone

class Check(models.Model):
    task = models.CharField('タスク名', max_length=20)
    A_date = models.DateField('作業1完了日')
    A_1 = models.BooleanField('作業1チェック1')
    A_2 = models.BooleanField('作業1チェック2')
    A_3 = models.BooleanField('作業1チェック3')
    A_4 = models.BooleanField('作業1チェック4')
    A_5 = models.BooleanField('作業1チェック5')
    B_date = models.DateField('作業2完了日')
    B_1 = models.BooleanField('作業2チェック1')
    B_2 = models.BooleanField('作業2チェック2')
    B_3 = models.BooleanField('作業2チェック3')
    B_4 = models.BooleanField('作業2チェック4')
    B_5 = models.BooleanField('作業2チェック5')
    C_date = models.DateField('作業3完了日')
    C_1 = models.BooleanField('作業3チェック1')
    C_2 = models.BooleanField('作業3チェック2')
    C_3 = models.BooleanField('作業3チェック3')
    C_4 = models.BooleanField('作業3チェック4')
    C_5 = models.BooleanField('作業3チェック5')
    D_date = models.DateField('作業4完了日')
    D_1 = models.BooleanField('作業4チェック1')
    D_2 = models.BooleanField('作業4チェック2')
    D_3 = models.BooleanField('作業4チェック3')
    D_4 = models.BooleanField('作業4チェック4')
    D_5 = models.BooleanField('作業4チェック5')
なりと

次のような感じでやってみてください。

    wb = Workbook()  # ワークブックの作成
    ws = wb.active
    for row, check in enumerate(Check.objects.all(), 1):
        if check.A_1 and check.A_2 and check.A_3 and check.A_4 and check.A_5:
            ws[f'A{row}'] = check.A_date  # A1やA2といったセル名になる
        else:
            ws[f'A{row}'] = '未完'

名無し

いつも拝見しております。

listviewとcreateviewを一つのクラスで使いたいです。 ですが、listviewとcreateviewで使用するmodelはForeignkeyで結びついていますが、 同じmodelではないため方法がわかりません。

listviewで表示し、その中にボタンを配置して ボタンが押されたらどのlistかを判別し、Foreignkeyとユーザー情報を 結びついたmodelに保存させたいです。

以上の内容を一つのクラスで実現することは出来ないのでしょうか。 説明が下手で申し訳ありませんが、教えていただきたいです。

コメントに返信する