ランダムおすすめ記事

ホームページ作りました

python、djangoで掲示板を作ってみたい③

まず掲示板の投稿に関して、新しい投稿が上にくるように改造しましょう。

余談ですが依然作ったアンケートサイトのコメントは古いものが一番上にくるようにしていました。

投稿の順番やadmin管理サイトの改造

と言ってもやり方はとても簡単。

class ListView(generic.ListView):
    model = Post

    def get_queryset(self):
        return Post.objects.order_by('-date')

dateはmodels.pyのfieldに含まれているdate。 -を前につけることでfieldの並び順が降順になります。

f:id:sr2460:20190123182124p:plain

新しい投稿が上に来ていますね。 続いてはadmin管理サイトをいじっていきます。 投稿されたコメントにクレームなどが来て削除しなくてはいけないかもしれません。 そんな時に管理画面でtextの文章を検索して絞り込んで表示できたら削除する時間の短縮になります。

ですので ademin.pyで

class PostAdmin(admin.ModelAdmin):
    search_fields = ['text']





admin.site.register(Post, PostAdmin)

search_fieldsにmodels.pyで設定したフィールドのうち'text'を指定しました。 そして admin.site.registerにPostAdminを追加します。 これだけで検索ボックスが出てきます。 僕はadmin.site.registerにPostAdminを入れ忘れてハマりましたw

f:id:sr2460:20190123182647p:plain

検索ボタンと検索ボックスが出てきました。 これだけのコードで良いのは便利ですね。

ちなみに投稿という文字の下のリストなんですがデフォルトだと、post_object(1)...post_object(5)みたいな並びなんですよ。 ここをtextが表示されるように変更します。

models.pyを変更

class Post(models.Model):
    class Meta:
        verbose_name = '投稿'
        verbose_name_plural = '投稿リスト'

    name = models.CharField('名前', max_length=20)
    text = models.TextField('本文')
    date = models.DateTimeField('日付', default=timezone.now)


    def __str__(self):
        return self.text

これでOK!

    def __str__(self):
        return self.text

を加えるだけでいけます。ホント便利ですね。textはPostにあるtextフィールドですよ。

いよいよ画像のアップロード機能に着手

ここからいよいよ画像アップロード機能を作成します。

参考にしたのはこの2つ!

やはりpython。djangoなら成人先生ですよね!

Djangoで、ファイルアップロード | NARITO BLOG

続いてhtmlへの表示が分からなかったんでここを参考にしました。

【Django】ImageFieldを使って画像を表示する | yamagablog

では早速!!

settings.py

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

続いてurls.py

from django.conf import settings
from django.conf.urls.static import static


urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

settings.pyの「MEDIA_URL,とMEDIA_ROOT)」を使うためにurlsに設定を入れるみたい。

adminサイトで画像を管理したいのでモデルを作って画像のアップロード機能を作成しましょう。

class UploadFile(models.Model):
    file = models.FileField('ファイル')

    def __str__(self):
        return self.file.url

続いてforms.pyを作成

from .models import UploadFile


class UploadModelForm(forms.ModelForm):

    class Meta:
        model = UploadFile
        fields = '__all__'

views.py

class Upload(generic.CreateView):
    model = UploadFile
    form_class = UploadModelForm
    success_url = reverse_lazy('board:uploadlist')

success_urlには'board:uploadlistという表示を入れました。 最終的には掲示板の投稿コメントと一緒に画像のアップロードする仕様にするのですが、今回はとりあえず別ページを作ってちゃんとアップロードができるのか実験してみます。

次にuploadfile_form.htmlというhtmlを作って画像投稿フォームを表示させます。これも最終的にはコメント投稿フォームと統合します。

    <form action="" method="POST" enctype="multipart/form-data">
        {{ form.as_p }}
        {% csrf_token %}
        <button type="submit">送信</button>
    </form>

urls.pyに

path('upload', views.Upload.as_view(), name='upload'),

を追加。これで投稿フォームが表示されます。

f:id:sr2460:20190124133820p:plain

続いて一覧表示用のhtmlを作成します。

views.pyにLListViewを使ったclassを追加。

class UploadListView(generic.ListView):
    model = UploadFile


urls.pyも新しく作ります。

path('uploadlist', views.UploadListView.as_view(), name='uploadlist')

ListViewにtemplate_nameを作っていないのでデフォルトでモデル名_listがhtmlの名前になります。

uploadfile_list.html

{% for upload in uploadfile_list %}

<p>{{ upload.file }}</p>


{% endfor %}

えいっ!!!!

f:id:sr2460:20190124135026p:plain

!!!!!!?????????????????

文字しか表示されない!!!! えっ?Listviewって画像表示されないの?とかいろいろ調べた結果htmlの表記を修正するだけで済みました。

正しくはこう。

{% for upload in uploadfile_list %}


<td><img src="{{ upload.file.url }}" ></td>


{% endfor %}


<img src=

はたしかにhtmlの基本ですね。あとはfor文のupload(modelはclass UploadFile(models.Model):)のfileフィールドを指定して最後に.urlを付ければOK!みたいです。 実際にmediaディレクトリに画像が送信されているのでこのurlを探索するためにurlの一文がいるんだろうなあと予想。

そして・・・。

f:id:sr2460:20190124135832p:plain

アップロードできました。大きい画像がアップロードされた時の画像の最大値とか決めたほうがいいのかな。 それは後々。 というわけで基本的な画像のアップロード機能は追加。

次回はすでに作ってある掲示板へのコメント投稿機能に画像アップロード機能を組み合わせてみましょう。 がんばるぞーーーーー!

python、djangoで掲示板を作ってみたい① - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定

python、djangoで掲示板を作ってみたい② - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定

python、djangoで掲示板を作ってみたい③ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定

python、djangoで掲示板を作ってみたい④ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定

python、djangoで掲示板を作ってみたい⑤ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定

python、djangoで掲示板を作ってみたい⑥ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定

python、djangoで掲示板を作ってみたい⑦ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定

python、djangoで掲示板を作ってみたい⑧ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定

python、djangoで掲示板を作ってみたい⑨ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定

python、djangoで掲示板を作ってみたい⑩ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定

python、djangoで掲示板を作ってみたい⑪ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定