読者です 読者をやめる 読者になる 読者になる

東大理三生のプログラミング奮闘記

初心者プログラマーが半年間でどれだけ成長するか!についてのブログです。勉強方法とか使った本とかについて書いていくと思います!プログラミングをもっと身近に感じてもらえたら嬉しいです!毎日更新を目指します!

単なるメモ機能が作れて感動した話

まあ一応つけとくか〜〜ぐらいで作り始めたメモ機能。

こいつにめちゃ苦しめられました。

でもおかげでGETとかPOSTとかのHTTPレスポンスのあたりのお話がちょっとわかった気になったのでよかった。


<成果物>
f:id:gragragrao:20170315132448p:plain

これにメモを書いて更新を押すと、ずっと保存されます。

f:id:gragragrao:20170315132606p:plain



<コード>

models.py

class Note(models.Model):
    worker = models.ForeignKey(Worker, null=True, blank=True)
    content = models.TextField(null=True, blank=True)

    def __str__(self):
        return self.worker.worker_name

    @classmethod
    def get_note(cls, worker):
        notes = cls.objects.filter(worker=worker)
        if notes.count() > 0:
            return notes[0]
        else:
            return None


views.py

# Djangoの組み込みモジュールをインポート
from django.shortcuts import get_object_or_404, render_to_response, redirect
from django.views import generic

# 自分で作ったモジュールをインポート
from managings.models import *
import managings.forms as managings_form_module

class WorkerDetailView(generic.TemplateView):
    model = Worker
    template_name = 'managings/each_worker.html'

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(request, *args, **kwargs)
        return super(WorkerDetailView, self).render_to_response(context)

    def get_context_data(self, request, *args, **kwargs):
        context = super(WorkerDetailView, self).get_context_data(**kwargs)

        worker_id = args[0]
        target_worker = get_object_or_404(Worker, id=int(worker_id))
        context{'worker'] = target_worker

        note = Note.get_note(target_worker)
        redirect_url = "/worker/{}".format(target_worker.id)
        content = note.content if note else ""
        context['note_form'] = managings_form_module.NoteForm(initial={'content':content, 'redirect_url':redirect_url, 'worker_id':target_worker.id})

        return context

def add_note_view(request, *args, *kwargs):
    form_data = request.POST
    if form_data:
        worker_id = int(args[0])
        worker = get_object_or_404(Worker, id=worker_id)
        content = form_data['content']
 
       note = Note.get_note(worker)

        if note:
            note.content = content
        else:
            note = Note(worker=worker, content=content)

        note.save()

        return redirect("/managings/worker/{}".format(worker_id))

    else:
        raise Http404


forms.py

from django import forms
from django.forms import ModelForm

from managings.models import *

class NoteForm(forms.Form):
    content = forms.CharField(widget=forms.Textarea(attrs={'class'="workernote-content"}))
    redirect_url = forms.CharField(widget=forms.HiddenInput())
    worker_id = forms.CharField(widget=forms.HiddenInput())

あとはurlを設定すればできます。



<引っかかったポイント>

>>そもそも、Djangoの組み込みがどれで使い方がわかってなかった

振り返ってみると、これが全てだったような気がします。Djangoのドキュメントも読んだりしてましたが、使ってみないことには実感がわかないし、使ってみようとしたら使い方がわからないしで大変でした。今回で少し足場ができたので、ちょっとは進みがよくなりそうです。


足場が少しできた感じがするので、少しずつドキュメントももう一回読み始めようかな〜と思います。

久しぶりの投稿でした。