Nepali Date Field and Date Picker Widget for Django
Project description
Django NPDateTime
Nepali Date Field and Date Picker Widget for Django
A Django package that provides custom model fields, form fields, and a modern date picker widget for working with Nepali (Bikram Sambat) dates. Powered by the high-performance npdatetime library.
Features
✨ Custom Model Fields - NepaliDateField and NepaliDateTimeField with direct access to fiscal year/quarter properties
...
✨ Fiscal Year Support - Built-in support for Nepali Fiscal Years (e.g., 2080/81) and quarters
🎨 Beautiful Date Picker Widget - Modern, responsive date picker with both BS and AD modes
🌐 Bilingual Support - English and Nepali language options
🔄 Auto Conversion - Seamless conversion between Bikram Sambat and Gregorian calendars
📝 Template Tags & Filters - Rich template tags for date formatting and conversion
⚡ High Performance - Built on Rust for maximum speed
🎯 Django Integration - Works seamlessly with Django's forms and admin
For Developers
If you're contributing to this package, the JavaScript/CSS files are synchronized from ../javascript/. When you update the date picker:
# Run the build script to sync assets
python build_assets.py
# or
./build_assets.sh
This copies:
picker.js→static/npdt/js/picker.min.jspicker.css→static/npdt/css/picker.csspkg/→static/npdt/js/pkg/
Installation
pip install django-npdt
# or with uv
uv add django-npdt
Quick Start
1. Add to INSTALLED_APPS
# settings.py
INSTALLED_APPS = [
...
'npdt',
...
]
2. Use in Models
from django.db import models
from npdt import NepaliDateField
class Person(models.Model):
name = models.CharField(max_length=100)
birth_date_bs = NepaliDateField()
def __str__(self):
return f"{self.name} - {self.birth_date_bs}"
3. Use in Forms
from django import forms
from npdt import NepaliDateField, NepaliDatePickerWidget
class PersonForm(forms.Form):
name = forms.CharField(max_length=100)
birth_date = NepaliDateField(
mode='BS',
language='np',
label='जन्म मिति'
)
4. Use Template Tags
{% load nepali_date %}
<p>Birth Date (BS): {{ person.birth_date_bs }}</p>
<p>Birth Date (AD): {{ person.birth_date_bs|to_gregorian_date }}</p>
<p>Fiscal Year: {{ person.birth_date_bs.fiscal_year }}</p>
<p>Today in BS: {% nepali_date_today %}</p>
<p>Month: {{ 1|nepali_month_name:"np" }}</p>
<p>Inline Picker: {% nepali_date_picker "event_date" theme="dark" %}</p>
Usage Guide
Model Fields
NepaliDateField
Stores Nepali dates in YYYY-MM-DD format.
from npdt.models import NepaliDateField
class Event(models.Model):
event_name = models.CharField(max_length=200)
event_date_bs = NepaliDateField(mode='BS', language='np') # Configurable!
NepaliDateTimeField
Stores Nepali dates with time in YYYY-MM-DD HH:MM:SS format.
from npdt.models import NepaliDateTimeField
class Meeting(models.Model):
title = models.CharField(max_length=200)
scheduled_at_bs = NepaliDateTimeField()
Form Fields and Widgets
Basic Date Picker
from npdt.forms import NepaliDateField
class PersonForm(forms.Form):
birth_date = NepaliDateField(
mode='BS', # 'BS' or 'AD'
language='en', # 'en' or 'np'
)
Advanced Configuration
from npdt.widgets import NepaliDatePickerWidget
class EventForm(forms.Form):
event_date = forms.CharField(
widget=NepaliDatePickerWidget(
mode='BS',
language='np',
theme='dark',
show_today_button=True,
show_clear_button=True,
min_date='2080-01-01',
max_date='2085-12-30',
)
)
Date Range Picker
from npdt.forms import NepaliDateRangeField
class ReportForm(forms.Form):
report_period = NepaliDateRangeField(
mode='BS',
language='np'
)
def clean_report_period(self):
period = self.cleaned_data['report_period']
start_date, end_date = period.split(' to ')
# Process date range
return period
Template Tags and Filters
Load the template tag library:
{% load nepali_date %}
Convert Gregorian to Nepali
{{ gregorian_date|to_nepali_date }}
{{ gregorian_date|to_nepali_date:"%Y/%m/%d" }}
Convert Nepali to Gregorian
{{ nepali_date|to_gregorian_date }}
{{ nepali_date|to_gregorian_date:"%d/%m/%Y" }}
Format Nepali Date
{{ "2081-01-15"|format_nepali_date:"%Y/%m/%d" }}
Get Month Name
{{ 1|nepali_month_name }} {# Baisakh #}
{{ 1|nepali_month_name:"np" }} {# बैशाख #}
Convert to Nepali Numerals
{{ 2081|to_nepali_number }} {# २०८१ #}
Fiscal Year and Quarter
{{ "2081-01-15"|fiscal_year }} {# 2080/81 #}
{{ "2081-01-15"|fiscal_quarter }} {# 3 #}
Get Today's Date
{% nepali_date_today %}
{% nepali_date_today "%Y/%m/%d" %}
Widget Options
The NepaliDatePickerWidget accepts the following options:
| Option | Type | Default | Description |
|---|---|---|---|
mode |
str | 'BS' |
Calendar mode: 'BS' or 'AD' |
language |
str | 'en' |
Interface language: 'en' or 'np' |
theme |
str | 'auto' |
Color theme: 'auto', 'light', or 'dark'. 'auto' follows html[data-theme]. |
format |
str | '%Y-%m-%d' |
Date format string |
include_time |
bool | False |
Include time picker |
show_today_button |
bool | True |
Show "Today" button |
show_clear_button |
bool | True |
Show "Clear" button |
min_date |
str | None |
Minimum selectable date |
max_date |
str | None |
Maximum selectable date |
Admin Integration
The date picker automatically integrates with Django admin:
from django.contrib import admin
from .models import Person
@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
list_display = ['name', 'birth_date_bs']
fields = ['name', 'birth_date_bs']
Examples
Complete Model Example
from django.db import models
from npdt.models import NepaliDateField, NepaliDateTimeField
class Employee(models.Model):
name = models.CharField(max_length=100)
join_date_bs = NepaliDateField(help_text="Joining date in BS")
birth_date_bs = NepaliDateField(blank=True, null=True)
last_login_bs = NepaliDateTimeField(blank=True, null=True)
class Meta:
ordering = ['-join_date_bs']
def __str__(self):
return f"{self.name} (Joined: {self.join_date_bs})"
ModelForm Example
from django import forms
from .models import Employee
class EmployeeForm(forms.ModelForm):
class Meta:
model = Employee
fields = ['name', 'join_date_bs', 'birth_date_bs']
widgets = {
'join_date_bs': NepaliDatePickerWidget(
mode='BS',
language='np',
theme='light'
),
'birth_date_bs': NepaliDatePickerWidget(
mode='BS',
language='np'
),
}
Template Example
{% load nepali_date %}
<!DOCTYPE html>
<html>
<head>
<title>Employee Details</title>
</head>
<body>
<h1>{{ employee.name }}</h1>
<div>
<strong>Join Date (BS):</strong>
{{ employee.join_date_bs|format_nepali_date:"%Y/%m/%d" }}
</div>
<div>
<strong>Join Date (AD):</strong>
{{ employee.join_date_bs|to_gregorian_date:"%B %d, %Y" }}
</div>
<div>
<strong>Birth Month:</strong>
{{ employee.birth_date_bs|slice:":7"|last|int|nepali_month_name:"np" }}
</div>
</body>
</html>
Requirements
- Python >= 3.8
- Django >= 3.2
- npdatetime >= 0.1.0
Browser Support
- Chrome/Edge (latest)
- Firefox (latest)
- Safari (latest)
- Mobile browsers (iOS Safari, Chrome Mobile)
License
MIT License - see LICENSE file for details
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Credits
Built on top of:
- npdatetime(Rust) - High-performance Nepali datetime library (Rust)
Support
For bugs and feature requests, please open an issue on GitHub.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file django_npdt-0.2.3.tar.gz.
File metadata
- Download URL: django_npdt-0.2.3.tar.gz
- Upload date:
- Size: 98.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4684961b8daa20f296d930cd3d1cf6ce426f5df438184925e3557a30e6e3a922
|
|
| MD5 |
b93c1083f539abb287309c7d3dfa1856
|
|
| BLAKE2b-256 |
73d4854f5f1b5fdf2549fbdd09fad986c2bd4fa0c74b6c3d004268c21a274df5
|
File details
Details for the file django_npdt-0.2.3-py3-none-any.whl.
File metadata
- Download URL: django_npdt-0.2.3-py3-none-any.whl
- Upload date:
- Size: 99.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
df6bd8066d7b561879411eba9276a885e9aaf8ef273adbca7b6523c4bd90c897
|
|
| MD5 |
ea78a4182f92616c15713f6e27cf0e0f
|
|
| BLAKE2b-256 |
01f41801fd84620ad050a11354c299fc8cbc9b8c7eed663e25adc342a8cfa2ff
|