-
+
{% if messages %}
{% for message in messages %}
@@ -64,18 +62,6 @@
{% endif %}
{% block content %}{% endblock %}
-
diff --git a/news/templates/news/home.html b/news/templates/news/home.html
index 8dabb47..c80f3ea 100644
--- a/news/templates/news/home.html
+++ b/news/templates/news/home.html
@@ -1,4 +1,36 @@
-{% extends 'news/base.html' %}
+{% extends "news/base.html" %}
{% block content %}
-
home
+ {% for article in articles %}
+
+
+
+
+ {% endfor %}
+ {% if is_paginated %}
+
+ {% if page_obj.has_previous %}
+
First
+
Previous
+ {% endif %}
+
+ {% for num in page_obj.paginator.page_range %}
+ {% if page_obj.number == num %}
+
{{ num }}
+ {% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
+
{{ num }}
+ {% endif %}
+ {% endfor %}
+
+ {% if page_obj.has_next %}
+
Next
+
Last
+ {% endif %}
+
+ {% endif %}
{% endblock content %}
diff --git a/news/templates/news/user_article.html b/news/templates/news/user_article.html
new file mode 100644
index 0000000..a279c41
--- /dev/null
+++ b/news/templates/news/user_article.html
@@ -0,0 +1,37 @@
+{% extends "news/base.html" %}
+{% block content %}
+
Articles by {{ view.kwargs.username }} ({{ page_obj.paginator.count }})
+ {% for article in articles %}
+
+
+
+
+ {% endfor %}
+ {% if is_paginated %}
+
+ {% if page_obj.has_previous %}
+
First
+
Previous
+ {% endif %}
+
+ {% for num in page_obj.paginator.page_range %}
+ {% if page_obj.number == num %}
+
{{ num }}
+ {% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
+
{{ num }}
+ {% endif %}
+ {% endfor %}
+
+ {% if page_obj.has_next %}
+
Next
+
Last
+ {% endif %}
+
+ {% endif %}
+{% endblock content %}
diff --git a/news/urls.py b/news/urls.py
index 7c61ae8..e45daed 100644
--- a/news/urls.py
+++ b/news/urls.py
@@ -1,9 +1,21 @@
-from django.contrib import admin
from django.urls import path
-
+from .views import (
+ ArticleListView,
+ ArticleDetailView,
+ ArticleCreateView,
+ ArticleUpdateView,
+ ArticleDeleteView,
+ UserArticleListView,
+)
from . import views
urlpatterns = [
path('', views.home, name='home'),
- path('about/', views.about, name='about')
+ path('about/', views.about, name='about'),
+
+ path('user/
', UserArticleListView.as_view(), name='user-articles'),
+ path('article//', ArticleDetailView.as_view(), name='article-detail'),
+ path('article/new/', ArticleCreateView.as_view(), name='article-create'),
+ path('article//update/', ArticleUpdateView.as_view(), name='article-update'),
+ path('article//delete/', ArticleDeleteView.as_view(), name='article-delete'),
]
diff --git a/news/views.py b/news/views.py
index 287642e..506201c 100644
--- a/news/views.py
+++ b/news/views.py
@@ -1,6 +1,18 @@
-from django.shortcuts import render
+from django.shortcuts import render, get_object_or_404
+from django.contrib.auth.models import User
+from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
+from django.views.generic import (
+ ListView,
+ DetailView,
+ CreateView,
+ UpdateView,
+ DeleteView,
+)
+
+from .models import Article
from users.models import Profile
+
# Create your views here.
def about (request):
@@ -10,4 +22,56 @@ def home (request):
if request.user.is_authenticated and Profile.objects.filter(user=request.user).count() < 1:
Profile.objects.create(user=request.user).save()
- return render (request, 'news/home.html')
+ context = {
+ 'articles': Article.objects.all()
+ }
+
+ return render (request, 'news/home.html', context)
+
+class ArticleListView(ListView):
+ model = Article
+ template_name = "news/home.html"
+ context_object_name='articles'
+ ordering = ['-date_posted']
+ paginate_by = 8
+
+class UserArticleListView(ListView):
+ model = Article
+ template_name = "news/user_articles.html"
+ context_object_name='articles'
+ paginate_by = 8
+
+ def get_queryset(self):
+ user = get_object_or_404(User, username=self.kwargs.get('username'))
+ return Article.objects.filter(author=user).order_by('-date_posted')
+
+class ArticleDetailView(DetailView):
+ model = Article
+
+class ArticleCreateView(LoginRequiredMixin, CreateView):
+ model = Article
+ fields=['content']
+
+ def form_valid(self, form):
+ form.instance.author = self.request.user
+ return super().form_valid(form)
+
+class ArticleUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
+ model = Article
+ fields=['content']
+
+ def form_valid(self, form):
+ form.instance.author = self.request.user
+ return super().form_valid(form)
+
+ def test_func(self):
+ article = self.get_object()
+ return self.request.user == article.author
+
+class ArticleDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
+ model = Article
+ success_url='/'
+
+ def test_func(self):
+ article = self.get_object()
+ return self.request.user == article.author