From 8cd51a10344710524a8e1271e46db534a935e75d Mon Sep 17 00:00:00 2001 From: Channn528 Date: Sun, 5 May 2019 15:26:30 +0000 Subject: [PATCH 1/3] share modified --- gongu/settings.py | 2 +- share/admin.py | 7 +++++-- share/models.py | 22 ++++++++++++++++++++-- share/templates/edit.html | 0 share/views.py | 23 +++-------------------- 5 files changed, 29 insertions(+), 25 deletions(-) create mode 100644 share/templates/edit.html diff --git a/gongu/settings.py b/gongu/settings.py index 31d5511..a9213e8 100644 --- a/gongu/settings.py +++ b/gongu/settings.py @@ -15,7 +15,7 @@ # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - +AUTH_USER_MODEL = 'share.User' # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/ diff --git a/share/admin.py b/share/admin.py index 0cf2438..6f7ade5 100644 --- a/share/admin.py +++ b/share/admin.py @@ -1,5 +1,8 @@ from django.contrib import admin -from .models import Content, Tag +from django.contrib.auth.admin import UserAdmin +from .models import Content, Tag, User # Register your models here. admin.site.register(Content) -admin.site.register(Tag) \ No newline at end of file +admin.site.register(Tag) + +admin.site.register(User, UserAdmin) \ No newline at end of file diff --git a/share/models.py b/share/models.py index 026abb5..da5d0f1 100644 --- a/share/models.py +++ b/share/models.py @@ -1,6 +1,9 @@ from django.db import models -from django import forms +from django.conf import settings +from imagekit.models import ProcessedImageField +from imagekit.processors import ResizeToFill +import re # Create your models here. class Content(models.Model): image = models.ImageField() @@ -16,4 +19,19 @@ def __str__(self): return self.title class Tag(models.Model): - name = models.CharField(max_length=140, unique=True) \ No newline at end of file + name = models.CharField(max_length=140, unique=True) + + +class Post(models.Model): + like_user_set = models.ManyToManyField(settings.AUTH_USER_MODEL, + blank=True, + related_name='like_user_set', + through='Like') + +@property +def like_count(self): + return self.like_user_set.count() + + +class Like(models.Model): + post = models.ForeignKey(Post) \ No newline at end of file diff --git a/share/templates/edit.html b/share/templates/edit.html new file mode 100644 index 0000000..e69de29 diff --git a/share/views.py b/share/views.py index 3da26f9..e96b0c1 100644 --- a/share/views.py +++ b/share/views.py @@ -25,7 +25,7 @@ def board(request, id): return render(request, 'board.html',{'contents',contents}) -# 기존 보드 및 추가보드에 쓰는거 +# 추가보드에 쓰는거 def detail(request): if request.method == "POST": image = request.POST.get('image') @@ -58,14 +58,14 @@ def update(request, id): contents.save() tags.save() - return redirect ('#', Content.pk, Tag.pk) + return redirect ('home.html', Content.pk, Tag.pk) # 수정 def edit(request, id): contents = Content.objects.get(pk=id) tags = Tag.objects.get(pk=id) - return render(request, '#', {'contents', contents}, {'tags',tags}) + return render(request, 'edit.html', {'contents', contents}, {'tags',tags}) #삭제 @@ -76,20 +76,3 @@ def delete(request, id): contents.delete() tags.delete() -# #좋아요 숫자세기 -# @login_required -# @require_POST -# def like(request): -# if request.method == 'POST': -# user = request.user # 로그인한 유저를 가져온다. -# memo_id = request.POST.get('pk', None) -# memo = Memos.objects.get(pk = memo_id) -# if memo.likes.filter(id = user.id).exists(): -# memo.likes.remove(user) -# message = 'You disliked this' -# else: -# memo.likes.add(user) -# message = 'You liked this' - -# context = {'likes_count' : memo.total_likes, 'message' : message} -# return HttpResponse(json.dumps(context), content_type='application/json') \ No newline at end of file From 5dcb0b241ffdd3f42d0801041e303c84ea9c44f8 Mon Sep 17 00:00:00 2001 From: Channn528 Date: Sun, 5 May 2019 16:43:48 +0000 Subject: [PATCH 2/3] first commit --- Pipfile | 12 +++++++++++ Pipfile.lock | 36 +++++++++++++++++++++++++++++++ manage.py | 2 +- share/models.py | 15 +++++-------- share/templates/board.html | 43 ++++++++++++++++++++++++++++++++++++-- share/urls.py | 1 + share/views.py | 20 ++++++++++++++++++ 7 files changed, 116 insertions(+), 13 deletions(-) create mode 100644 Pipfile create mode 100644 Pipfile.lock diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..eefe101 --- /dev/null +++ b/Pipfile @@ -0,0 +1,12 @@ +[[source]] +name = "pypi" +url = "https://pypi.org/simple" +verify_ssl = true + +[dev-packages] + +[packages] +django = "*" + +[requires] +python_version = "3.4" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 0000000..ce6b24c --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,36 @@ +{ + "_meta": { + "hash": { + "sha256": "23352d0caa8a998fd1aa16bb3d43d9d9609440510985a868e7eb1ff30f225e47" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.4" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "django": { + "hashes": [ + "sha256:665457d4146bbd34ae9d2970fa3b37082d7b225b0671bfd24c337458f229db78", + "sha256:bde46d4dbc410678e89bc95ea5d312dd6eb4c37d0fa0e19c9415cad94addf22f" + ], + "index": "pypi", + "version": "==2.0.13" + }, + "pytz": { + "hashes": [ + "sha256:303879e36b721603cc54604edcac9d20401bdbe31e1e4fdee5b9f98d5d31dfda", + "sha256:d747dd3d23d77ef44c6a3526e274af6efeb0a6f1afd5a69ba4d5be4098c8e141" + ], + "version": "==2019.1" + } + }, + "develop": {} +} diff --git a/manage.py b/manage.py index 15a3ec9..480dfd5 100755 --- a/manage.py +++ b/manage.py @@ -11,5 +11,5 @@ "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) diff --git a/share/models.py b/share/models.py index da5d0f1..1563514 100644 --- a/share/models.py +++ b/share/models.py @@ -1,9 +1,7 @@ from django.db import models from django.conf import settings -from imagekit.models import ProcessedImageField -from imagekit.processors import ResizeToFill -import re + # Create your models here. class Content(models.Model): image = models.ImageField() @@ -23,14 +21,11 @@ class Tag(models.Model): class Post(models.Model): - like_user_set = models.ManyToManyField(settings.AUTH_USER_MODEL, - blank=True, - related_name='like_user_set', - through='Like') + like_user_set = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name='like_user_set', through='Like') -@property -def like_count(self): - return self.like_user_set.count() + @property + def like_count(self): + return self.like_user_set.count() class Like(models.Model): diff --git a/share/templates/board.html b/share/templates/board.html index 5f7f1d9..288dba2 100644 --- a/share/templates/board.html +++ b/share/templates/board.html @@ -15,8 +15,47 @@

title

diff --git a/share/urls.py b/share/urls.py index 6cf0dd7..0d91b2f 100644 --- a/share/urls.py +++ b/share/urls.py @@ -4,4 +4,5 @@ urlpatterns = [ path('home/',views.home, name='home'), path('/', views.board, name='board'), + path('like.', views.post_like, name='post_like'), ] \ No newline at end of file diff --git a/share/views.py b/share/views.py index e96b0c1..384b28e 100644 --- a/share/views.py +++ b/share/views.py @@ -76,3 +76,23 @@ def delete(request, id): contents.delete() tags.delete() +# 좋아요 +@login_required +@require_POST +def post_like(request): + pk = request.POST.get('pk', None) + post = get_object_or_404(Post, pk=pk) + post_like, post_like_created = post.like_set.get_or_create(user=request.user) + + if not post_like_created: + post_like.delete() + message = "좋아요 취소" + else: + message = "좋아요" + + context = {'like_count': post.like_count, + 'message': message, + 'nickname': request.user.profile.nickname } + + return HttpResponse(json.dumps(context), content_type="application/json") + \ No newline at end of file From 26b4fdeae2ed7a637471cf684d99013675208ac3 Mon Sep 17 00:00:00 2001 From: Channn528 Date: Sun, 5 May 2019 17:55:29 +0000 Subject: [PATCH 3/3] like --- db.sqlite3 | Bin 48128 -> 55296 bytes gongu/settings.py | 2 +- share/admin.py | 4 +--- share/migrations/0001_initial.py | 28 +++++++++++++++++++++++++++- share/models.py | 9 +++++---- 5 files changed, 34 insertions(+), 9 deletions(-) diff --git a/db.sqlite3 b/db.sqlite3 index b21f6917e8ff37ea300feca4f6f7518d87bc4115..246099f3c3dd2639c546e85744f8aaae9e785bfe 100644 GIT binary patch delta 2380 zcmZ`)Z){Ul6o2=f_xif79h+TwYrB?qe}J-$wS9ek?KarvmH!cC>7j(k)vt zBr?Zvz=EKZYy2R%L86Ht)YvvL#>fW{;TuAbNQ{3731|#RNQ_a5;=Ql0f1=o=H|PA$ z`JHp_x%b?+_jh*hM{v|$)5b7Nko*h34e3^?xs7SN#qtC)z(r~Zz5m1(gy^18sIKeF`LP{Vc2fg?d*I9!6iY)o@ z&s;|l3Wnuy(1-necL@rH{60UP;^h()@P-sGKFbG7kmOau3fAcYCCDpSXr5Pw|``IVsL#cn~i6*d$INm3x}1)dR`dn3`E@gzPa)D?pSWWP_A z@S8$o3G#&$Nx>I{mZm}wNtT0h*aU|e9mD}n!&mSQ5nhI)aFq1&Dd;fs(1IenQX_+7 zvGJYpiHZ1V(rK)OMS2z7H4z(!d4@BYz^$JciHyev6Y(7}xXtkRwMr{8;M0|>>kP1- zfnVS=L$))uCU}O>_mF$)qRIR1Jq3ks%sO#8RbTR8R_4t+gETAiYM>`cOx~O-QfNG*nb$=_yk~7FKh}jRcKM zT4u=u8jk?ACJxz=KsmId#}@8iC32`8afNLaZ=*4f7dBVKE7bxyb&Ew1uMri$S`MoP zqOI5E5iJBocy+TZB~vwbPV8v~Cv3#RDxVROFaks5Shm2%Oxg%dJRoFns;fg?>*-oy zS67?5T63w@hr6oi1BT!}eZYcnpN!aD07kZEXSrHpn`M|;^dVc%e!yN&r(eunI|cbdZFTtFx!M)2`y8EW_!+(|JU!oh6e=x$Sa@n6;borQuR(nI4GVs7#E37= z>wqA5dVU$6ntU30vQ1pI0nm8{oo9R4Pc!LH(A4fOLF^+tvc{9q*zQsybz6h+=wQ$v z8}fSta>?Y;YFM*jRsS=EEz%nP!)b6mv7y|d!L_tOtuY>L@a$eeGEY4$H9cjTdV63f zwmnv!y8VAs|C{r$)S6F&XJ6k+K~xkp(~Qr}wIeV7^MpOOVE$fpHmcL>uQKQ=`#ub0 z(iad+Z|=sexh=?tU&&3vbXyPJlUC2K}EPzJq@hEX?aMm%$q`J6e3u+;yPmU`1JVdj9U;j`L7wbXCaXrTgqp;K+{ItX(1kNkAPpAu?n@C ze0;`gH51w1SeWbriw=4B{s;P2BQdut95xagux!2Xb!X zT9|S<)v)F7YguA?)m)CeN8w2#P+4N?VXIdY7vJAPVwG)I+2xOMS^PvZITe>J@1iB3 K2UV7Us{a7t;+?Gk delta 1476 zcmZ9JO>7%Q6vt=gjlD}_r%7#RomgpXLhBmmW4)ht5(rhQ272Nnf&-w`N=(u=bwcb& zjes=i0ipsb?nsD339Txj-rCd`gouP9P^FgU6GT98>7gLhP;sED;814QYdgZyO7H)h z_uhZz@7ZfG`;dGTs*fXtI{8=r^%dIG);MavOI#d12AkGFJNyd|;2!)2ci=Dh6}Dir zSRWn$a=>I;@NTW#r6s!bWQV4yX3}J1G+IHbsj4ZBU83Dpl+aC6Wq;7F3Q{yJ$&upf zt)N6wP3S3h+ND>KtSG9G_ls}>!Jlvo ze&#+G;eD8f6Wrw`Xz^0XhjXLp$xJ>yBGywWR8r1jc6PTadubqG@3k&KYiU5T)yU-d z)CBlwAY#j^C)?gF?GfQPf^GN-Zo*ga8JvYvtZv}K;>9mW*dtOT`O2ns0#_khRZM+K z!b2$v1gzIsu3q3uvXt$*hj1COYEOwc3oTMpOK~%% z);3GBS0(e1L~$o3&R8`McZoa0RqnFwiM65%i{D7kv_TN^OgNNSEc5_-zMmFP_0RX5 zKR~r0$|3j#uERVW1qCR%OP0w3IYW+;r-={W!Hf7D9>Kl18U2lJqatD`S15FgdxI{7 zBQcR}uQdviQ+wANBMrO`wU)!|OJ~FUI$@sc{s2FTB?R`?T14Srd_BvZI~h^2Qrto0~UunuHzRhzc&J z&TmAcl-IGu|I#XtSMy`@n{QvH^L`ISYY4632jo5SWufqOasI-740E+QYgyQfV{H9X zKYMZEHEgh}3o?E3OrOb?t{XUR9Tdgl!@Bd|iEfCIY5c=t;Rc_Kbg{wJ!?=_Ev+@MH kxoW^%dx~9MIf6Sl86pEowsreu+{QXr-od+yIQ&TX4<|*PCIA2c diff --git a/gongu/settings.py b/gongu/settings.py index a9213e8..31d5511 100644 --- a/gongu/settings.py +++ b/gongu/settings.py @@ -15,7 +15,7 @@ # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -AUTH_USER_MODEL = 'share.User' + # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/ diff --git a/share/admin.py b/share/admin.py index 6f7ade5..5085689 100644 --- a/share/admin.py +++ b/share/admin.py @@ -1,8 +1,6 @@ from django.contrib import admin -from django.contrib.auth.admin import UserAdmin + from .models import Content, Tag, User # Register your models here. admin.site.register(Content) admin.site.register(Tag) - -admin.site.register(User, UserAdmin) \ No newline at end of file diff --git a/share/migrations/0001_initial.py b/share/migrations/0001_initial.py index e510f11..b0cbee3 100644 --- a/share/migrations/0001_initial.py +++ b/share/migrations/0001_initial.py @@ -1,6 +1,8 @@ -# Generated by Django 2.0.13 on 2019-05-05 10:41 +# Generated by Django 2.0.13 on 2019-05-05 17:38 +from django.conf import settings from django.db import migrations, models +import django.db.models.deletion class Migration(migrations.Migration): @@ -8,6 +10,7 @@ class Migration(migrations.Migration): initial = True dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ @@ -23,6 +26,19 @@ class Migration(migrations.Migration): ('updated_at', models.DateTimeField(auto_now=True)), ], ), + migrations.CreateModel( + name='Like', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ], + ), + migrations.CreateModel( + name='Post', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('like_user_set', models.ManyToManyField(blank=True, related_name='like_user_set', through='share.Like', to=settings.AUTH_USER_MODEL)), + ], + ), migrations.CreateModel( name='Tag', fields=[ @@ -30,6 +46,16 @@ class Migration(migrations.Migration): ('name', models.CharField(max_length=140, unique=True)), ], ), + migrations.AddField( + model_name='like', + name='post', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='share.Post'), + ), + migrations.AddField( + model_name='like', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), migrations.AddField( model_name='content', name='tag_set', diff --git a/share/models.py b/share/models.py index 1563514..1deb233 100644 --- a/share/models.py +++ b/share/models.py @@ -1,5 +1,5 @@ from django.db import models - +from django.contrib.auth.models import User from django.conf import settings # Create your models here. @@ -21,12 +21,13 @@ class Tag(models.Model): class Post(models.Model): - like_user_set = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name='like_user_set', through='Like') - + like_user_set = models.ManyToManyField(User, blank=True, related_name='like_user_set', through='Like') + @property def like_count(self): return self.like_user_set.count() class Like(models.Model): - post = models.ForeignKey(Post) \ No newline at end of file + post = models.ForeignKey(Post, on_delete=models.CASCADE) + user = models.ForeignKey(User, on_delete=models.CASCADE) \ No newline at end of file