DjangoのFormにおいて、ドロップダウンリストの表示順序と表示件数を変更する方法を知りたいです。
ファイルをフォルダ分けして画面に表示できるようにするため、ディレクトリのModelとファイルのModelを作成し、外部キーによって紐づけています。
ディレクトリをあらかじめ作成したのち、ファイルをアップロードしようとすると下記のような画面となります。
ディレクトリの数が数百に増えた場合を想定すると、以下の問題、懸念があります。
・古いディレクトリが上に表示され、また数が多すぎるため見づらい
・一度にすべてのディレクトリが読み込まれ、パフォーマンスが悪くなる
この問題、懸念に対して、以下のような対処をしたいのですが、方法がわからずアドバイスいただきたいです。
・新しいディレクトリが上に表示されるようにする
・表示件数は10件に制限する
・10件の下に、さらに10件を読み込むボタンを作成するか、スクロールしたらさらに10件読み込むようにする
よろしくお願いいたします。
以下、コードです。
ディレクトリ構造 myproject |-myproject | |-.....(配下は省略) |-templates | |-base.html | |-form_test | |-dir_create.html | |-file_upload.html | |-home.html | |-form_test_app | |-forms.py | |-models.py | |-urls.py | |-views.py | |-.....(その他のファイルは省略) | |-media | |-Image(ファイルの保存場所) | |-manage.py |-db.sqlite3
python
1# file_upload_app/models.py 2 3from django.db import models 4from django.core.validators import FileExtensionValidator 5 6class FileDir(models.Model): 7 dir_name = models.CharField(max_length=100, unique=True) 8 created_at = models.DateTimeField(auto_now_add=True) 9 updated_at = models.DateTimeField(auto_now=True) 10 11 def __str__(self): 12 return self.dir_name 13 14class File(models.Model): 15 file = models.FileField( 16 upload_to='files/', 17 validators=[FileExtensionValidator(['pdf', 'png', 'jpeg', 'jpg', 'mp4'])], 18 ) 19 dir_name = models.ForeignKey(FileDir, on_delete=models.CASCADE) 20 created_at = models.DateTimeField(auto_now_add=True) 21 updated_at = models.DateTimeField(auto_now=True) 22 23 def __str__(self): 24 return str(self.file)
python
1# file_upload_app/forms.py 2from django import forms 3from .models import File, FileDir 4 5class FileDirForm(forms.ModelForm): 6 class Meta: 7 model = FileDir 8 fields = ('dir_name',) 9 10class FileForm(forms.ModelForm): 11 class Meta: 12 model = File 13 fields = ('file', 'dir_name',)
python
1# file_upload_app/views.py 2from django.shortcuts import render, redirect 3from django.views.generic import ListView, CreateView, UpdateView 4from .forms import FileForm, FileDirForm 5 6def dir_create(request): 7 if request.method == 'POST': 8 form = FileDirForm(request.POST, request.FILES) 9 if form.is_valid(): 10 form.save() 11 return redirect('form_test/home') 12 else: 13 form = FileDirForm() 14 return render(request, 'form_test/dir_create.html', {'form': form}) 15 16def file_upload(request): 17 if request.method == 'POST': 18 form = FileForm(request.POST, request.FILES) 19 if form.is_valid(): 20 form.save() 21 return redirect('form_test/home') 22 else: 23 form = FileForm() 24 return render(request, 'form_test/file_upload.html', {'form': form})
python
1# file_upload_app/urls.py 2from django.urls import path, include 3from .views import file_upload, dir_create 4 5urlpatterns = [ 6 path('home/', file_upload, name='form_test/home'), 7 path('file_upload/', file_upload, name='form_test/file_upload'), 8 path('dir_create/', dir_create, name='form_test/dir_create'), 9] 10
html
1{# templates/base.html #} 2<!doctype html> 3<html lang="en"> 4 <head> 5 <meta charset="utf-8"> 6 </head> 7 <body> 8 {% block content %} 9 {% endblock %} 10 </body> 11</html>
html
1{# templates/form_test/dir_create.html フォルダ作成画面 #} 2{% extends 'base.html' %} 3{% block content %} 4<h4>フォルダ作成</h4> 5<div> 6 <form method="post" enctype="multipart/form-data"> 7 {% csrf_token %} 8 {{ form.as_p }} 9 <button type="submit">フォルダ作成</button> 10 </form> 11</div> 12{% endblock %}
html
1{# templates/form_test/dir_create.html ファイルアップロード画面 #} 2{% extends 'base.html' %} 3{% block content %} 4<h4>ファイルアップロード</h4> 5<div> 6 <form method="post" enctype="multipart/form-data"> 7 {% csrf_token %} 8 {{ form.as_p }} 9 <button type="submit">フォルダ作成</button> 10 </form> 11</div> 12{% endblock %}
html
1{# templates/form_test/home.html HOME画面 #} 2{% extends "base.html" %} 3{% block content %} 4HOME画面です 5{% endblock %}
環境は、以下の通りです。
python 3.9.5
Django 3.2.4
あなたの回答
tips
プレビュー