Skip to content

Commit

Permalink
django course 35 commit
Browse files Browse the repository at this point in the history
  • Loading branch information
kim946509 committed Feb 11, 2023
1 parent d765e95 commit 5846bf0
Show file tree
Hide file tree
Showing 21 changed files with 222 additions and 2 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -83,3 +83,4 @@ venv/
db.sqlite3
.idea/

media/
Binary file added articleapp/__pycache__/decorators.cpython-310.pyc
Binary file not shown.
Binary file added articleapp/__pycache__/forms.cpython-310.pyc
Binary file not shown.
Binary file modified articleapp/__pycache__/models.cpython-310.pyc
Binary file not shown.
Binary file modified articleapp/__pycache__/urls.cpython-310.pyc
Binary file not shown.
Binary file added articleapp/__pycache__/views.cpython-310.pyc
Binary file not shown.
12 changes: 12 additions & 0 deletions articleapp/decorators.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from django.http import HttpResponseForbidden

from articleapp.models import Article


def article_ownership_required(func):
def decorated(request,*args,**kwargs):
article = Article.objects.get(pk=kwargs['pk'])
if not article.writer == request.user:
return HttpResponseForbidden()
return func(request,*args,**kwargs)
return decorated
9 changes: 9 additions & 0 deletions articleapp/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from django.forms import ModelForm

from articleapp.models import Article


class ArticleCreationForm(ModelForm):
class Meta:
model=Article
fields = ['title', 'image', 'content']
28 changes: 28 additions & 0 deletions articleapp/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Generated by Django 4.1.4 on 2023-02-11 06:10

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

initial = True

dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]

operations = [
migrations.CreateModel(
name='Article',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateField(auto_created=True, null=True)),
('title', models.CharField(max_length=200, null=True)),
('image', models.ImageField(upload_to='article/')),
('content', models.TextField(null=True)),
('writer', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='article', to=settings.AUTH_USER_MODEL)),
],
),
]
Binary file not shown.
10 changes: 10 additions & 0 deletions articleapp/models.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
from django.contrib.auth.models import User
from django.db import models

# Create your models here.

class Article(models.Model):
writer = models.ForeignKey(User, on_delete = models.SET_NULL, related_name='article', null=True)

title = models.CharField(max_length=200, null=True)
image = models.ImageField(upload_to='article/', null=False)
content = models.TextField(null=True)

created_at = models.DateField(auto_created=True,null=True)
16 changes: 16 additions & 0 deletions articleapp/templates/articleapp/create.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{% extends 'base.html' %}
{% load bootstrap4 %}

{% block content %}

<div style="text-align: center;max-width:500px; margin: 4rem auto">
<div class="mb-4"> {# margin bottom #}
<h4>Article Create</h4>
</div>
<form action="{% url 'articleapp:create' %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
{% bootstrap_form form %}
<input type="submit" class="btn btn-dark rounded-pill col-6 mt-3">
</form>
</div>
{% endblock %}
15 changes: 15 additions & 0 deletions articleapp/templates/articleapp/delete.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{% extends 'base.html'%}
{% load bootstrap4 %}

{% block content %}

<div style="text-align: center;max-width:500px; margin: 4rem auto">
<div class="mb-4"> {# margin bottom #}
<h4>Delete Article : {{ target_article.title }}</h4>
</div>
<form action="{% url 'articleapp:delete' pk=target_article.pk %}" method="post">
{% csrf_token %}
<input type="submit" class="btn btn-danger rounded-pill col-6 mt-3">
</form>
</div>
{% endblock %}
26 changes: 26 additions & 0 deletions articleapp/templates/articleapp/detail.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{% extends 'base.html' %}

{% block content %}

<div>
<div style="text-align: center; max-width: 500px; margin: 4rem auto;">

<h1>
{{ target_article.title }}
</h1>

<img src="{{ target_article.image.url }}" alt="">
<p>
{{ target_article.content }}
</p>

<a href="{% url 'articleapp:update' pk=target_article.pk %}">
<p>Update Article</p>
</a>
<a href="{% url 'articleapp:delete' pk=target_article.pk %}">
<p>Delete Article</p>
</a>
</div>
</div>

{% endblock %}
7 changes: 7 additions & 0 deletions articleapp/templates/articleapp/list.html
Original file line number Diff line number Diff line change
Expand Up @@ -57,5 +57,12 @@
<img src="https://picsum.photos/200/300" alt="">
</div>
</div>

<div style="text-align:center">
<a href="{% url 'articleapp:create' %}" class="btn btn-dark rounded-pll col-3 mt-3 mb-3">
Create Article
</a>
</div>

<script src="{% static 'js/magicgrid.js' %}"></script>
{% endblock %}
16 changes: 16 additions & 0 deletions articleapp/templates/articleapp/update.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{% extends 'base.html' %}
{% load bootstrap4 %}

{% block content %}

<div style="text-align: center;max-width:500px; margin: 4rem auto">
<div class="mb-4"> {# margin bottom #}
<h4>Article Update</h4>
</div>
<form action="{% url 'articleapp:update' pk=target_article.pk%}" method="post" enctype="multipart/form-data">
{% csrf_token %}
{% bootstrap_form form %}
<input type="submit" class="btn btn-dark rounded-pill col-6 mt-3">
</form>
</div>
{% endblock %}
11 changes: 10 additions & 1 deletion articleapp/urls.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,15 @@
from django.urls import path
from django.views.generic import TemplateView

from articleapp.views import ArticleCreateView, ArticleDetailView, ArticleUpdateView, ArticleDeleteView

app_name='articleapp'

urlpatterns = [
path('list/', TemplateView.as_view(template_name='articleapp/list.html'), name='list')
path('list/', TemplateView.as_view(template_name='articleapp/list.html'), name='list'),

path('create/', ArticleCreateView.as_view(), name='create'),
path('detail/<int:pk>', ArticleDetailView.as_view(), name='detail'),
path('update/<int:pk>', ArticleUpdateView.as_view(), name='update'),
path('delete/<int:pk>', ArticleDeleteView.as_view(), name='delete')
]
48 changes: 48 additions & 0 deletions articleapp/views.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,51 @@
import form as form
from django.contrib.auth.decorators import login_required
from django.shortcuts import render
from django.urls import reverse, reverse_lazy
from django.utils.decorators import method_decorator
from django.views.generic import CreateView, DetailView, UpdateView, DeleteView

from articleapp.decorators import article_ownership_required
from articleapp.forms import ArticleCreationForm
from articleapp.models import Article


# Create your views here.

@method_decorator(login_required, 'get')
@method_decorator(login_required, 'post')
class ArticleCreateView(CreateView):
model = Article
form_class = ArticleCreationForm
template_name = 'articleapp/create.html'

def form_valid(self,form):
temp_article = form.save(commit=False)
temp_article.writer = self.request.user
return super().form_valid(form)
def get_success_url(self):
return reverse('articleapp:detail', kwargs={'pk':self.object.pk})

class ArticleDetailView(DetailView):
model = Article
context_object_name = 'target_article'
template_name = 'articleapp/detail.html'

@method_decorator(article_ownership_required, 'get')
@method_decorator(article_ownership_required, 'post')
class ArticleUpdateView(UpdateView):
model = Article
form_class = ArticleCreationForm
context_object_name = 'target_article'
template_name = 'articleapp/update.html'

def get_success_url(self):
return reverse('articleapp:detail', kwargs={'pk':self.object.pk})

@method_decorator(article_ownership_required, 'get')
@method_decorator(article_ownership_required, 'post')
class ArticleDeleteView(DeleteView):
model = Article
context_object_name = 'target_article'
template_name = 'articleapp/delete.html'
success_url = reverse_lazy('articleapp:list')
21 changes: 21 additions & 0 deletions profileapp/migrations/0002_alter_profile_user.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Generated by Django 4.1.4 on 2023-02-11 06:10

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('profileapp', '0001_initial'),
]

operations = [
migrations.AlterField(
model_name='profile',
name='user',
field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='profile', to=settings.AUTH_USER_MODEL),
),
]
Binary file not shown.
4 changes: 3 additions & 1 deletion templates/header.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
<h1 class="pragmatic_logo">Pragmatic</h1>
</div>
<div>
<span>nav1</span>
<a href="{% url 'articleapp:list' %}">
<span>Articles</span>
</a>
<span>nav2</span>
<span>nav3</span>
{% if not user.is_authenticated %}
Expand Down

0 comments on commit 5846bf0

Please sign in to comment.