Skip to main content

Manage Vitejs frontends for Django

Project description

Django Vite Vue

pub package

Manage Vitejs frontends and compile them to Django static files and templates. Features

  • Configure Vitejs for Django: use a management command to help configuring Vitejs to compile to Django templates and static files
  • Typescript scaffolding: generate Typescript models from existing Django models
  • Api and views: api helper frontend class configured for Django and login/logout views with single page app support

Install

pip install django-vitevue

Add "vv", to INSTALLED_APPS

Make sure the basic Django template and static dirs settings are present. Run the vvcheck management command to see if the config is ok

Configuration of a Vitejs app to compile to Django templates and static files

Architecture and settings

The recommended file structure for a single page app is:

  • project_root_dir
    • django_project
    • vite_project

A management command is available to configure some Vitejs frontends compilation options and commands. First create a frontend in the parent folder of the Django project with a command like:

yarn create vite frontend --template=vue-ts

Or use and existing one.

The root directory can be configured by a setting. By default it is the parent directory of the Django's BASE_DIR, like in the file structure shown above. Example setting to put the frontend dev code directly in the django project directory:

VV_BASE_DIR = BASE_DIR

Generate the Vitejs config

If the Vite app project folder is named frontend the command can run without arguments:

python {django_project}/manage.py viteconf

Otherwise add the app folder name as an argument:

python {django_project}/manage.py viteconf --app=my_frontend_app_folder_name

This command will do the following things:

  • Generate compilation options for the vite.config.js or vite.config.ts file
  • Generate npm build commands for package.json
  • Check if all the required npm dependencies are installed

The command runs in dry mode and outputs the config. To write to config files use the -w flag:

python {django_project}/manage.py viteconf -w

Options

Configure templates and static files destination

The npm build command will be configured to output to the Django static file folder and an index.html template. To change these options use these command flags:

--template=mytemplate.html: the template to compile to. Relative to the django templates dir --static=myfolder: the static folder to compile assets to. Relative to the first staticfiles dir

Example to compile the template to templates/myapp/mytemplate.html and the static assets to static/myapp:

python {django_project}/manage.py viteconf --template=myapp/mytemplate.html --static=myapp

Compile to a partial template

By default it will compile a full index page, in single page app mode. It is possible to compile to a static partial template, without the html tags. Use the partial flag:

-p: the template will not have html tags and can be included in a parent Django template

To configure Vitejs to compile an app in partial mode to a specific template and static folder:

python {django_project}/manage.py viteconf -p --app=partialapp --template=mytemplate.html --static=myfolder

Typescript models

Generate Typescript models from Django models

The tsmodels command can generate Typescript models from Django models:

python {django_project}/manage.py tsmodels my_django_app

To write the models to the frontend app:

python {django_project}/manage.py tsmodels my_django_app -w
Example output:

These Django models:

class Market(models.Model):
    name = models.CharField(max_length=255)

class Instrument(models.Model):
    name = models.CharField(max_length=255)

class Trade(models.Model):
    date = models.DateTimeField()
    price = models.FloatField()
    quantity = models.FloatField()
    market = models.ForeignKey(Market, on_delete=models.CASCADE)
    instrument = models.ForeignKey(Instrument, on_delete=models.CASCADE)
    side = models.CharField(max_length=4, choices=SIDE)

Output these Typescript models:

// Model Market

import MarketContract from "./contract";

export default class Market {
	id: number;
	name: string;

	constructor ({id, name}: MarketContract) {
		this.id=id;
		this.name=name
	}

	static fromJson(data: Record<string, any>): Market {
		return new Market(data as MarketContract)
	}
}

// -------------- Interface -------------- 

export default interface MarketContract {
	id: number,
	name: string,
}

// Model Instrument

import InstrumentContract from "./contract";

export default class Instrument {
	id: number;
	name: string;

	constructor ({id, name}: InstrumentContract) {
		this.id=id;
		this.name=name
	}

	static fromJson(data: Record<string, any>): Instrument {
		return new Instrument(data as InstrumentContract)
	}
}

// -------------- Interface -------------- 

export default interface InstrumentContract {
	id: number,
	name: string,
}

// Model Trade

import MarketContract from "../market/contract";
import InstrumentContract from "../instrument/contract";
import TradeContract from "./contract";

export default class Trade {
	id: number;
	date: string;
	price: number;
	quantity: number;
	market: MarketContract;
	instrument: InstrumentContract;
	side: string;

	constructor ({id, date, price, quantity, market, instrument, side}: TradeContract) {
		this.id=id;
		this.date=date;
		this.price=price;
		this.quantity=quantity;
		this.market=market;
		this.instrument=instrument;
		this.side=side
	}

	static fromJson(data: Record<string, any>): Trade {
		return new Trade(data as TradeContract)
	}
}

// -------------- Interface -------------- 

import MarketContract from "../market/contract";
import InstrumentContract from "../instrument/contract";

export default interface TradeContract {
	id: number,
	date: string,
	price: number,
	quantity: number,
	market: MarketContract,
	instrument: InstrumentContract,
	side: string,
}

Add an api to the generated frontend models

To scaffold an api for an existing frontend model:

python {django_project}/manage.py tsapi my_django_app_name

This will create an api for the Typescript models and copy an api helper in the frontend src directory

Example output

Methods will be added to models. Ex:

export default class Market {
	// ...

	static async load(id: number | string): Promise<Market> {
		const res = await api.get<Record<string, any>>(`/api/market/${id}/`);
		return Market.fromJson(res)
	}
}

Login views

Some login/logout views are available from the backend, and supported by the frontend api helper class. Add the urls in urls.py:

urlpatterns = [
    path("vv/", include("vv.urls")),
		#...
]

Two api views will be available: /vv/auth/login/ and /vv/auth/logout/. The frontend api helper class have support for these views example code

Example

Example repository: https://github.com/synw/django-vitevue-example

Run the tests

Clone and run:

make install
make test-initial

To run the code quality checker install Pycheck and run:

make quality

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django-vitevue-0.8.0.tar.gz (16.2 kB view details)

Uploaded Source

Built Distribution

django_vitevue-0.8.0-py3-none-any.whl (20.7 kB view details)

Uploaded Python 3

File details

Details for the file django-vitevue-0.8.0.tar.gz.

File metadata

  • Download URL: django-vitevue-0.8.0.tar.gz
  • Upload date:
  • Size: 16.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10

File hashes

Hashes for django-vitevue-0.8.0.tar.gz
Algorithm Hash digest
SHA256 7e2b1c4a6b30259940e7923c63f4223b8a068a1143527f0c25c3b630d341c4e0
MD5 36d9ee94931c45499385aa9557e163be
BLAKE2b-256 f7486b50dd6572a26a110f56a11a7b11d63bab450ca7773df669b4cef5166fbc

See more details on using hashes here.

File details

Details for the file django_vitevue-0.8.0-py3-none-any.whl.

File metadata

  • Download URL: django_vitevue-0.8.0-py3-none-any.whl
  • Upload date:
  • Size: 20.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10

File hashes

Hashes for django_vitevue-0.8.0-py3-none-any.whl
Algorithm Hash digest
SHA256 17691723528dfd7c302bacb3e251526f58e83afe13d84421ce18f8978868f43d
MD5 7a64a7d1a6dae2d2ffedb35119e5bde4
BLAKE2b-256 341cf9ed9933e855f36294a368ab6c7ae7c7221ca9855d473883e5144b56678d

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page