commit
394c1989b4
25 changed files with 495 additions and 0 deletions
@ -0,0 +1,137 @@ |
|||
# Django # |
|||
*.log |
|||
*.pot |
|||
*.pyc |
|||
__pycache__ |
|||
#db.sqlite3 |
|||
media |
|||
|
|||
# Backup files # |
|||
*.bak |
|||
|
|||
# If you are using PyCharm # |
|||
# User-specific stuff |
|||
.idea/**/workspace.xml |
|||
.idea/**/tasks.xml |
|||
.idea/**/usage.statistics.xml |
|||
.idea/**/dictionaries |
|||
.idea/**/shelf |
|||
|
|||
# AWS User-specific |
|||
.idea/**/aws.xml |
|||
|
|||
# Generated files |
|||
.idea/**/contentModel.xml |
|||
|
|||
# Sensitive or high-churn files |
|||
.idea/**/dataSources/ |
|||
.idea/**/dataSources.ids |
|||
.idea/**/dataSources.local.xml |
|||
.idea/**/sqlDataSources.xml |
|||
.idea/**/dynamic.xml |
|||
.idea/**/uiDesigner.xml |
|||
.idea/**/dbnavigator.xml |
|||
|
|||
# Gradle |
|||
.idea/**/gradle.xml |
|||
.idea/**/libraries |
|||
|
|||
# File-based project format |
|||
*.iws |
|||
|
|||
# IntelliJ |
|||
out/ |
|||
|
|||
# JIRA plugin |
|||
atlassian-ide-plugin.xml |
|||
|
|||
# Python # |
|||
*.py[cod] |
|||
*$py.class |
|||
|
|||
# Distribution / packaging |
|||
.Python build/ |
|||
develop-eggs/ |
|||
dist/ |
|||
downloads/ |
|||
eggs/ |
|||
.eggs/ |
|||
lib/ |
|||
lib64/ |
|||
parts/ |
|||
sdist/ |
|||
var/ |
|||
wheels/ |
|||
*.egg-info/ |
|||
.installed.cfg |
|||
*.egg |
|||
*.manifest |
|||
*.spec |
|||
|
|||
# Installer logs |
|||
pip-log.txt |
|||
pip-delete-this-directory.txt |
|||
|
|||
# Unit test / coverage reports |
|||
htmlcov/ |
|||
.tox/ |
|||
.coverage |
|||
.coverage.* |
|||
.cache |
|||
.pytest_cache/ |
|||
nosetests.xml |
|||
coverage.xml |
|||
*.cover |
|||
.hypothesis/ |
|||
|
|||
# Jupyter Notebook |
|||
.ipynb_checkpoints |
|||
|
|||
# pyenv |
|||
.python-version |
|||
|
|||
# celery |
|||
celerybeat-schedule.* |
|||
|
|||
# SageMath parsed files |
|||
*.sage.py |
|||
|
|||
# Environments |
|||
.env |
|||
.venv |
|||
env/ |
|||
venv/ |
|||
ENV/ |
|||
env.bak/ |
|||
venv.bak/ |
|||
|
|||
# mkdocs documentation |
|||
/site |
|||
|
|||
# mypy |
|||
.mypy_cache/ |
|||
|
|||
# Sublime Text # |
|||
*.tmlanguage.cache |
|||
*.tmPreferences.cache |
|||
*.stTheme.cache |
|||
*.sublime-workspace |
|||
*.sublime-project |
|||
|
|||
# sftp configuration file |
|||
sftp-config.json |
|||
|
|||
# Package control specific files Package |
|||
Control.last-run |
|||
Control.ca-list |
|||
Control.ca-bundle |
|||
Control.system-ca-bundle |
|||
GitHub.sublime-settings |
|||
|
|||
# Visual Studio Code # |
|||
.vscode/* |
|||
!.vscode/settings.json |
|||
!.vscode/tasks.json |
|||
!.vscode/launch.json |
|||
!.vscode/extensions.json |
|||
.history |
|||
@ -0,0 +1,7 @@ |
|||
from django.contrib import admin |
|||
from .models import Post |
|||
|
|||
class PostAdmin(admin.ModelAdmin): |
|||
list_display = ('title', 'short_description', 'pub_date') |
|||
|
|||
admin.site.register(Post, PostAdmin) |
|||
@ -0,0 +1,6 @@ |
|||
from django.apps import AppConfig |
|||
|
|||
|
|||
class BlogConfig(AppConfig): |
|||
default_auto_field = 'django.db.models.BigAutoField' |
|||
name = 'blog' |
|||
@ -0,0 +1,23 @@ |
|||
# Generated by Django 4.2.7 on 2023-11-26 20:58 |
|||
|
|||
from django.db import migrations, models |
|||
|
|||
|
|||
class Migration(migrations.Migration): |
|||
|
|||
initial = True |
|||
|
|||
dependencies = [ |
|||
] |
|||
|
|||
operations = [ |
|||
migrations.CreateModel( |
|||
name='Post', |
|||
fields=[ |
|||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|||
('title', models.CharField(max_length=200)), |
|||
('content', models.TextField()), |
|||
('pub_date', models.DateTimeField(verbose_name='date published')), |
|||
], |
|||
), |
|||
] |
|||
@ -0,0 +1,18 @@ |
|||
# Generated by Django 4.2.7 on 2023-11-26 21:05 |
|||
|
|||
from django.db import migrations, models |
|||
|
|||
|
|||
class Migration(migrations.Migration): |
|||
|
|||
dependencies = [ |
|||
('blog', '0001_initial'), |
|||
] |
|||
|
|||
operations = [ |
|||
migrations.AddField( |
|||
model_name='post', |
|||
name='short_description', |
|||
field=models.TextField(blank=True, max_length=300, null=True), |
|||
), |
|||
] |
|||
@ -0,0 +1,10 @@ |
|||
from django.db import models |
|||
|
|||
class Post(models.Model): |
|||
title = models.CharField(max_length=200) |
|||
content = models.TextField() |
|||
short_description = models.TextField(max_length=300, blank=True, null=True) |
|||
pub_date = models.DateTimeField('date published') |
|||
|
|||
def __str__(self): |
|||
return self.title |
|||
@ -0,0 +1,4 @@ |
|||
<h1>{{ post.title }}</h1> |
|||
<p>{{ post.short_description }}</p> |
|||
<p>{{ post.pub_date }}</p> |
|||
<p>{{ post.content }}</p> |
|||
@ -0,0 +1,77 @@ |
|||
<!DOCTYPE html> |
|||
<html lang="en"> |
|||
<head> |
|||
<meta charset="UTF-8"> |
|||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> |
|||
<title>Dark Blog</title> |
|||
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous"> |
|||
<style> |
|||
body { |
|||
background-color: #222; |
|||
color: #fff; |
|||
padding-top: 56px; /* Adjust this if you have a fixed navbar */ |
|||
} |
|||
|
|||
.navbar { |
|||
background-color: #333; |
|||
} |
|||
|
|||
.container { |
|||
margin-top: 20px; |
|||
} |
|||
|
|||
.card { |
|||
background-color: #333; |
|||
color: #fff; |
|||
} |
|||
|
|||
.card-header { |
|||
background-color: #555; |
|||
} |
|||
|
|||
.card-body { |
|||
border-top: 1px solid #555; |
|||
} |
|||
</style> |
|||
</head> |
|||
<body> |
|||
|
|||
<!-- Navbar --> |
|||
<nav class="navbar navbar-expand-lg navbar-dark fixed-top"> |
|||
<a class="navbar-brand" href="#">Dark Blog</a> |
|||
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> |
|||
<span class="navbar-toggler-icon"></span> |
|||
</button> |
|||
<div class="collapse navbar-collapse" id="navbarNav"> |
|||
<ul class="navbar-nav ml-auto"> |
|||
<li class="nav-item active"> |
|||
<a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a> |
|||
</li> |
|||
</ul> |
|||
</div> |
|||
</nav> |
|||
|
|||
<!-- Content --> |
|||
<div class="container"> |
|||
<h1 class="mb-4">Dark Blog Posts</h1> |
|||
|
|||
{% for post in posts %} |
|||
<div class="card mb-4"> |
|||
<div class="card-header"> |
|||
<h2><a class="text-white" href="{% url 'blog:post_detail' post.id %}">{{ post.title }}</a></h2> |
|||
</div> |
|||
<div class="card-body"> |
|||
<p>{{ post.short_description }}</p> |
|||
<p class="text-muted">{{ post.pub_date }}</p> |
|||
</div> |
|||
</div> |
|||
{% endfor %} |
|||
</div> |
|||
|
|||
<!-- Bootstrap JavaScript (optional) --> |
|||
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script> |
|||
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.0.7/dist/umd/popper.min.js" integrity="sha384-c7IErAlR6aD7me9UaH8aTUpGGUsIfF4hEzQElF6/8zzj/5+8zkbUWEYI6TSA2EZb" crossorigin="anonymous"></script> |
|||
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js" integrity="sha384-B4gt1jrGC7Jh4AgTPSdUtOBvfO8sh+WyTVMGh/J7kqcG2qNQ8q6vcvcMhvAgi/R" crossorigin="anonymous"></script> |
|||
|
|||
</body> |
|||
</html> |
|||
@ -0,0 +1,3 @@ |
|||
from django.test import TestCase |
|||
|
|||
# Create your tests here. |
|||
@ -0,0 +1,8 @@ |
|||
from django.urls import path |
|||
from . import views |
|||
|
|||
app_name = 'blog' |
|||
urlpatterns = [ |
|||
path('', views.post_list, name='post_list'), |
|||
path('<int:post_id>/', views.post_detail, name='post_detail'), |
|||
] |
|||
@ -0,0 +1,10 @@ |
|||
from django.shortcuts import render, get_object_or_404 |
|||
from .models import Post |
|||
|
|||
def post_list(request): |
|||
posts = Post.objects.all() |
|||
return render(request, 'blog/post_list.html', {'posts': posts}) |
|||
|
|||
def post_detail(request, post_id): |
|||
post = get_object_or_404(Post, pk=post_id) |
|||
return render(request, 'blog/post_detail.html', {'post': post}) |
|||
Binary file not shown.
@ -0,0 +1,22 @@ |
|||
#!/usr/bin/env python |
|||
"""Django's command-line utility for administrative tasks.""" |
|||
import os |
|||
import sys |
|||
|
|||
|
|||
def main(): |
|||
"""Run administrative tasks.""" |
|||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myblog.settings') |
|||
try: |
|||
from django.core.management import execute_from_command_line |
|||
except ImportError as exc: |
|||
raise ImportError( |
|||
"Couldn't import Django. Are you sure it's installed and " |
|||
"available on your PYTHONPATH environment variable? Did you " |
|||
"forget to activate a virtual environment?" |
|||
) from exc |
|||
execute_from_command_line(sys.argv) |
|||
|
|||
|
|||
if __name__ == '__main__': |
|||
main() |
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,16 @@ |
|||
""" |
|||
ASGI config for myblog project. |
|||
|
|||
It exposes the ASGI callable as a module-level variable named ``application``. |
|||
|
|||
For more information on this file, see |
|||
https://docs.djangoproject.com/en/4.2/howto/deployment/asgi/ |
|||
""" |
|||
|
|||
import os |
|||
|
|||
from django.core.asgi import get_asgi_application |
|||
|
|||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myblog.settings') |
|||
|
|||
application = get_asgi_application() |
|||
@ -0,0 +1,124 @@ |
|||
""" |
|||
Django settings for myblog project. |
|||
|
|||
Generated by 'django-admin startproject' using Django 4.2.7. |
|||
|
|||
For more information on this file, see |
|||
https://docs.djangoproject.com/en/4.2/topics/settings/ |
|||
|
|||
For the full list of settings and their values, see |
|||
https://docs.djangoproject.com/en/4.2/ref/settings/ |
|||
""" |
|||
|
|||
from pathlib import Path |
|||
|
|||
# Build paths inside the project like this: BASE_DIR / 'subdir'. |
|||
BASE_DIR = Path(__file__).resolve().parent.parent |
|||
|
|||
|
|||
# Quick-start development settings - unsuitable for production |
|||
# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/ |
|||
|
|||
# SECURITY WARNING: keep the secret key used in production secret! |
|||
SECRET_KEY = 'django-insecure-u260h434jemg53tn^bd&%x^h9p09^kbkk!2%3t^8%kd0nt^xjf' |
|||
|
|||
# SECURITY WARNING: don't run with debug turned on in production! |
|||
DEBUG = True |
|||
|
|||
ALLOWED_HOSTS = [] |
|||
|
|||
|
|||
# Application definition |
|||
|
|||
INSTALLED_APPS = [ |
|||
'django.contrib.admin', |
|||
'django.contrib.auth', |
|||
'django.contrib.contenttypes', |
|||
'django.contrib.sessions', |
|||
'django.contrib.messages', |
|||
'django.contrib.staticfiles', |
|||
'blog', |
|||
] |
|||
|
|||
MIDDLEWARE = [ |
|||
'django.middleware.security.SecurityMiddleware', |
|||
'django.contrib.sessions.middleware.SessionMiddleware', |
|||
'django.middleware.common.CommonMiddleware', |
|||
'django.middleware.csrf.CsrfViewMiddleware', |
|||
'django.contrib.auth.middleware.AuthenticationMiddleware', |
|||
'django.contrib.messages.middleware.MessageMiddleware', |
|||
'django.middleware.clickjacking.XFrameOptionsMiddleware', |
|||
] |
|||
|
|||
ROOT_URLCONF = 'myblog.urls' |
|||
|
|||
TEMPLATES = [ |
|||
{ |
|||
'BACKEND': 'django.template.backends.django.DjangoTemplates', |
|||
'DIRS': [], |
|||
'APP_DIRS': True, |
|||
'OPTIONS': { |
|||
'context_processors': [ |
|||
'django.template.context_processors.debug', |
|||
'django.template.context_processors.request', |
|||
'django.contrib.auth.context_processors.auth', |
|||
'django.contrib.messages.context_processors.messages', |
|||
], |
|||
}, |
|||
}, |
|||
] |
|||
|
|||
WSGI_APPLICATION = 'myblog.wsgi.application' |
|||
|
|||
|
|||
# Database |
|||
# https://docs.djangoproject.com/en/4.2/ref/settings/#databases |
|||
|
|||
DATABASES = { |
|||
'default': { |
|||
'ENGINE': 'django.db.backends.sqlite3', |
|||
'NAME': BASE_DIR / 'db.sqlite3', |
|||
} |
|||
} |
|||
|
|||
|
|||
# Password validation |
|||
# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators |
|||
|
|||
AUTH_PASSWORD_VALIDATORS = [ |
|||
{ |
|||
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', |
|||
}, |
|||
{ |
|||
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', |
|||
}, |
|||
{ |
|||
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', |
|||
}, |
|||
{ |
|||
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', |
|||
}, |
|||
] |
|||
|
|||
|
|||
# Internationalization |
|||
# https://docs.djangoproject.com/en/4.2/topics/i18n/ |
|||
|
|||
LANGUAGE_CODE = 'en-us' |
|||
|
|||
TIME_ZONE = 'UTC' |
|||
|
|||
USE_I18N = True |
|||
|
|||
USE_TZ = True |
|||
|
|||
|
|||
# Static files (CSS, JavaScript, Images) |
|||
# https://docs.djangoproject.com/en/4.2/howto/static-files/ |
|||
|
|||
STATIC_URL = 'static/' |
|||
|
|||
# Default primary key field type |
|||
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field |
|||
|
|||
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' |
|||
@ -0,0 +1,7 @@ |
|||
from django.contrib import admin |
|||
from django.urls import path, include |
|||
|
|||
urlpatterns = [ |
|||
path('admin/', admin.site.urls), |
|||
path('blog/', include('blog.urls')), |
|||
] |
|||
@ -0,0 +1,16 @@ |
|||
""" |
|||
WSGI config for myblog project. |
|||
|
|||
It exposes the WSGI callable as a module-level variable named ``application``. |
|||
|
|||
For more information on this file, see |
|||
https://docs.djangoproject.com/en/4.2/howto/deployment/wsgi/ |
|||
""" |
|||
|
|||
import os |
|||
|
|||
from django.core.wsgi import get_wsgi_application |
|||
|
|||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myblog.settings') |
|||
|
|||
application = get_wsgi_application() |
|||
@ -0,0 +1,7 @@ |
|||
from django.contrib import admin |
|||
from django.urls import path, include |
|||
|
|||
urlpatterns = [ |
|||
path('admin/', admin.site.urls), |
|||
path('blog/', include('blog.urls')), |
|||
] |
|||
Loading…
Reference in new issue