[Django]メッセージの投稿

### Messageモデル
/hello/models.py

class Message(models.Model):
	friend = models.ForeignKey(Friend, on_delete=models.CASCADE)
	title = models.CharField(max_length=100)
	content = models.CharField(max_length=300)
	pub_date = models.DateTimeField(auto_now_add=True)

	def __str__(self):
		return '<Message:id=' + str(self.id) + ', ' + self.title + '(' + str(self.pub_date) + ')>'

	class Meta:
		ordering = ('pub_date',)

– on_delete=models.CASCADEは削除を指定するという意味
– auto_now_add=Trueは自動的に値を設定
– Metaはクラスの基本的設定を記述

### マイグレーション実行
$ python manage.py makemigrations helloMigrations for ‘hello’:
hello/migrations/0002_auto_20200712_2230.py
– Alter field age on friend
– Alter field name on friend
– Create model Message
$ python manage.py migrate

### admin.py
/hello/admin.py

from django.contrib import admin
from .models import Friend, Message

admin.site.register(Friend)
admin.site.register(Message)

http://192.168.33.10:8000/admin/

### Messageページ作成
/hello/urls.py

	path('message/', views.message, name='message'),
	path('message/<int:page>', views.message, name='message'),

/hello/forms.py

from.models import Friend, Message

class MessageForm(forms.ModelForm):
	class Meta:
		model = Message
		fields = ['title', 'content', 'friend']
		widgets = {
			'title': forms.TextInput(attrs={'class':'formcontrol form-control-sm'}),
			'content': forms.Textarea(attrs={'class':'form-control form-control-sm', 'rows':2}),
			'friend': forms.Select(attrs={'class':'form-control form-control-sm'}),
		}

/hello/views.py

from .models import Friend, Message
from .forms import FriendForm, MessageForm

def message(request, page=1):
	if(request.method == 'POST'):
		obj = Message()
		form = MessageForm(request.POST, instance=obj)
		form.save()
	data = Message.objects.all().reverse()
	paginator = Paginator(data, 5)
	params = {
		'title': 'Message',
		'form': MessageForm(),
		'data': paginator.get_page(page),
	}
	return render(request, 'hello/message.html', params)

/hello/templates/hello/message.html

<body class="container">
	<h1 class="display-4 text-primary">{{title}}</h1>
	<form action="{% url 'message' %}" method="post">
		{% csrf_token %}
		{{ form.as_p }}
		<input type="submit" value="send" class="btn btn-primary">
		<div class="mt-5"></div>
		<table class="table">
			<tr>
				<th class="py-1">title</th>
				<th class="py-1">name</th>
				<th class="py-1">datetime</th>
			</tr>
		{% for item in data %}
			<tr>
				<td class="py-2">{{item.title}}</td>
				<td class="py-2">{{item.friend.name}}</td>
				<td class="py-2">{{item.pub_date}}</td>
			</tr>
		{% endfor %}
		</table>

	<ul class="pagination justify-content-center">
		{% if data.has_previous %}
		<li class="page-item">
			<a class="page-link" href="{% url 'message' %}">
			&laquo; first</a>
		</li>
		<li class="page-item">
			<a class="page-link" href="{% url 'message' %}{{data.previous_page_number}}">
			&laquo; prev</a>
		</li>
		{% else %}
		<li class="page-item">
			<a class="page-link">
			&laquo; first</a>
		</li>
		<li class="page-item">
			<a class="page-link">
			&laquo; prev</a>
		</li>
		{% endif %}
		<li class="page-item">
			<a class="page-link">
			{{data.number}}/{{data.paginator.num_pages}}</a>
		</li>
		{% if data.has_next %}
		<li class="page-item">
			<a class="page-link" href="{% url 'message' %}{{data.next_page_number}}">
			next &raquo;</a>
		</li>
		<li class="page-item">
			<a class="page-link" href="{% url 'message' %}{{data.paginator.num_pages}}">
			last &raquo;</a>
		</li>
		{% else %}
		<li class="page-item">
			<a class="page-link">next &raquo;</a>
		</li>
		<li class="page-item">
			<a class="page-link">last &raquo;</a>
		</li>
		{% endif %}
	</ul>
</body>

/hello/templates/hello/index.html

<table class="table">
			<tr>
				<th>id</th>
				<th>name</th>
				<th>age</th>
				<th>mail</th>
				<th>birthday</th>
				<th>Messages</th>
			</tr>
		{% for item in data %}
			<tr>
				<td>{{item.id}}</td>
				<td>{{item.name}}</td>
				<td>{{item.age}}</td>
				<td>{{item.mail}}</td>
				<td>{{item.birthday}}</td>
				<td><ul>
					{% for ob in item.message_set.all %}
						<li>{{ob.title}}</li>
					{% endfor %}
				</ul>
				</td>
			</tr>
		{% endfor %}
		</table>