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

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

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

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

Python

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

Q&A

解決済

1回答

2559閲覧

Djangoでリンクを張る

Yhaya

総合スコア439

Django

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

Python

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

0グッド

0クリップ

投稿2018/10/21 14:49

やりたいこと

ディレクトリ内のフォルダ・ファイルを取得してそれを表示し、それぞれに、次のディレクトリへのリンクを張りたいと考えています。つまり

bash

1$ tree 2a 3|__ b 4|__ c 5d 6|__ e 7

というような階層構造があったときに、ページにはaとdが表示されていて、aをクリックするとディレクトリa内部に移動してb, cが表示される、というようなことを実現したいと思っています。

現状

現時点で、ルートディレクトリのフォルダ・ファイルを取得してページ上に表示するところまでは実現しているのですが、リンクを張ることができていません。

階層構造としては、次のようになっています。メインがconfigと名前がついているもので、ここに新たにfile_choiceというアプリケーションが加わっている状況です。

bash

1. 2├── config 3│   ├── __init__.py 4│   ├── __pycache__ 5│   │   ├── __init__.cpython-36.pyc 6│   │   ├── settings.cpython-36.pyc 7│   │   ├── urls.cpython-36.pyc 8│   │   └── wsgi.cpython-36.pyc 9│   ├── settings.py 10│   ├── urls.py 11│   └── wsgi.py 12├── db.sqlite3 13├── file_choice 14│   ├── admin.py 15│   ├── apps.py 16│   ├── __init__.py 17│   ├── migrations 18│   │   ├── __init__.py 19│   │   └── __pycache__ 20│   │   └── __init__.cpython-36.pyc 21│   ├── models.py 22│   ├── __pycache__ 23│   │   ├── admin.cpython-36.pyc 24│   │   ├── apps.cpython-36.pyc 25│   │   ├── __init__.cpython-36.pyc 26│   │   ├── models.cpython-36.pyc 27│   │   ├── urls.cpython-36.pyc 28│   │   ├── views.cpython-35.pyc 29│   │   └── views.cpython-36.pyc 30│   ├── static 31│   │   └── file_choice 32│   │   └── style.css 33│   ├── templates 34│   │   └── file_choice 35│   │   └── index.html 36│   ├── tests.py 37│   ├── urls.py 38│   └── views.py 39├── libs 40│   ├── dir_check.py 41│   ├── __init__.py 42│   └── __pycache__ 43│   ├── dir_check.cpython-35.pyc 44│   ├── dir_check.cpython-36.pyc 45│   ├── __init__.cpython-35.pyc 46│   └── __init__.cpython-36.pyc 47├── lib_tests 48│   └── test_dir_check.py 49└── manage.py

config内のurls.py

python

1from django.contrib import admin 2from django.urls import path, include 3from django.conf.urls import url 4 5urlpatterns = [ 6 path('file_choice/', include('file_choice.urls', namespace='file_choice')), 7 path('admin/', admin.site.urls), 8]

file_choice内のファイルは

urls.pyが

python

1from django.urls import path 2 3from . import views 4 5app_name = 'file_choice' 6urlpatterns = [ 7 path('', views.DirectoryChange.as_view(), name='index'), 8 path('file_choice/<str:next>/', views.DirectoryChange.as_view(), name='index'), 9 ]

views.pyが

python

1from libs.dir_check import DirCheck 2 3from django.shortcuts import render 4from django.template import loader 5from django.http import HttpResponse 6from django.views import generic 7 8# Create your views here. 9class DirectoryChange(generic.TemplateView): 10 template_name = 'file_choice/index.html' 11 12 def get_context_data(self, **kwargs): 13 context = super().get_context_data(**kwargs) 14 context['dir_info'] = DirCheck().get_info() 15 16 return context

そして、template/file_choice/index.htmlが

html

1<!DOCTYPE html> 2<head> 3 <meta charset="utf-8"> 4 {% load static %} 5 <link rel="stylesheet" type="text/css" href="{% static 'file_choice/style.css' %}"> 6 <title>files</title> 7</head> 8<body> 9 <h1>Files</h1> 10 <div class="file_table"> 11 <a href=""> <!-- ここに何を書くべきか --> 12 <div class="files"> 13 .. 14 </div> 15 </a> 16 {% for f in dir_info.next %} 17 <a href=""> <!-- ここに何を書くべきか --> 18 <div class="files"> 19 {{ f }} 20 </div> 21 </a> 22 {% endfor %} 23 </div> 24</body>

そして、DirCheckというクラスは自分で定義していて、現在のディレクトリとその中のフォルダ・ファイル、そして親ディレクトリを保持しています。

python

1import os 2 3class DirCheck: 4 def __init__(self): 5 self.now = self.get_now_dir() 6 self.previous = self.previous_dir() 7 self.next = self.next_dirs() 8 9 def get_now_dir(self): 10 return '/mnt/c/' 11 12 def next_dirs(self): 13 return os.listdir(self.now) 14 15 def previous_dir(self): 16 previous = self.now.rsplit('/', 2)[0] + '/' 17 return previous 18 19 def move_forward(self, to): 20 temp_now = self.now 21 self.now += to 22 self.previous = temp_now 23 self.next = self.next_dirs() 24 return self.now 25 26 def move_backward(self): 27 temp_now = self.now 28 self.now = self.previous 29 self.next = temp_now 30 self.previous = self.previous_dir() 31 32 def get_info(self): 33 context = { 34 'now' : self.now, 35 'next' : self.next, 36 'previous' : self.previous, 37 } 38 39 return context

Django初心者で、わからないことが多いのですがよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ただファイルとディレクトリのリンクを表示するだけなら
Apacheにそのものずばりな設定があるので、
コード書く必要すらありませんが、Djangoの勉強のためにやるなら...

python

1urlpatterns = [ 2 path('', views.DirectoryChange.as_view(), name='index'), 3 path('file_choice/<str:next>/', views.DirectoryChange.as_view(), name='index'), 4 ]

自分がやるならここところは、ファイルパスを渡して、
ディレクトリに対しては中身を表示するように書いて、
ファイルに対しては中身そのものを返すようにするviewを作ります。

投稿2018/11/25 14:38

kokardy

総合スコア781

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問