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