반응형
CodingEntrepreneurs Django 강의 정리
파이프기호>
1. 여러 필터를 지정
2. 하나 이상의 필터를 통해 블록의 내용을 필터링
forms>
from django import forms
from .models import BlogPost
class BlogPostForm(forms.Form):
title = forms.CharField()
slug = forms.SlugField()
content = forms.CharField(widget=forms.Textarea)
class BlogPostModelForm(forms.ModelForm):
# title = forms.CharField()
class Meta:
model = BlogPost
fields = ["title", "slug", "content", "publish_date"]
def clean_title(self, *args, **kwargs):
# print(dir(self))
instance = self.instance
print(instance)
title = self.cleaned_data.get("title")
qs = BlogPost.objects.filter(title=title)
if instance is not None:
qs = qs.exclude(pk=instance.pk) # id=instance.id
if qs.exists():
raise forms.ValidationError(
"This title has already been used. Please try again."
)
return title
list-inline.html>
<div class="col-12 col-md-10 mb-3 mx-auto">
<div class='card {% if not blog_post.publish_date %} bg-dark text-light {% endif %}'>
<div class='card-body'>
<h5 class="card-title">{{ blog_post.title }}</h5>
<p class="cart-text">
<small class="text-muted">{{ blog_post.publish_date }}</small>
{% if truncate %}
{{ blog_post.content|linebreaks|truncatewords:30 }}
{% else %}
{{ blog_post.content|linebreaks }}
{% endif %}
</p>
{% if not detail %}
{% if not blog_post.publish_date %} Draft {% endif %}
<a href="{{ blog_post.get_absolute_url }}">View</a>
{% endif %}
</div>
</div>
</div>
views>
from django.contrib.auth.decorators import login_required
from django.contrib.admin.views.decorators import staff_member_required
from django.http import Http404
from django.shortcuts import render, get_object_or_404, redirect
# Create your views here.
from .forms import BlogPostModelForm
from .models import BlogPost
# CRUD
# GET -> Retrieve / List
# POST -> Create / Update / DELETE
# Create Retrieve Update Delete
def blog_post_list_view(request):
# list out objects
# could be search
qs = BlogPost.objects.all().published() # queryset -> list of python object
if request.user.is_authenticated:
my_qs = BlogPost.objects.filter(user=request.user)
qs = (qs | my_qs).distinct()
# qs = BlogPost.objects.all() # queryset -> list of python object
template_name = "blog/list.html"
context = {"object_list": qs}
return render(request, template_name, context)
# @login_required
@staff_member_required
def blog_post_create_view(request):
# create objects
# ? use a form
# request.user -> return something
form = BlogPostModelForm(request.POST or None)
if form.is_valid():
obj = form.save(commit=False)
obj.user = request.user
obj.save()
form = BlogPostModelForm()
template_name = "form.html"
context = {"form": form}
return render(request, template_name, context)
def blog_post_detail_view(request, slug):
# 1 object -> detail view
obj = get_object_or_404(BlogPost, slug=slug)
template_name = "blog/detail.html"
context = {"object": obj}
return render(request, template_name, context)
@staff_member_required
def blog_post_update_view(request, slug):
obj = get_object_or_404(BlogPost, slug=slug)
form = BlogPostModelForm(request.POST or None, instance=obj)
if form.is_valid():
form.save()
template_name = "form.html"
context = {"title": f"Update {obj.title}", "form": form}
return render(request, template_name, context)
@staff_member_required
def blog_post_delete_view(request, slug):
obj = get_object_or_404(BlogPost, slug=slug)
template_name = "blog/delete.html"
if request.method == "POST":
obj.delete()
return redirect("/blog")
context = {"object": obj}
return render(request, template_name, context)
반응형
'Python_WEB > Try_Django' 카테고리의 다른 글
[Django]Image Field and Uploading Images (0) | 2020.06.27 |
---|---|
[Django]Static Files and Uploading Files (0) | 2020.06.21 |
[Django]Model Managers and Custom QuerySets (0) | 2020.06.21 |
[Django]Publish Date, Timestamp & Updated (0) | 2020.06.21 |
[Django]Include with Arguments (0) | 2020.06.21 |