Reputation: 39
I'm trying to build a very basic messaging app where someone types into a text input, presses send then see's the message on the screen. And I want to do all of this on the same URL. Here is what I have right now:
views.py:
from django.shortcuts import render
from django.views.generic import ListView, CreateView
from message import models
# Create your views here.
class ViewMessages(ListView):
model = models.Messages
context_object_name = 'messages'
class WriteMessages(CreateView):
fields = ('message',)
model = models.Messages
models.py:
from django.db import models
from django import forms
from django.core.urlresolvers import reverse
# Create your models here.
class Messages(models.Model):
message = models.CharField(max_length=300)
def __str__(self):
return self.message
def get_absolute_url(self):
return reverse("view")
project urls.py:
from django.conf.urls import url
from django.contrib import admin
from message import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^view/', views.ViewMessages.as_view(), name="view"),
url(r'^create/', views.WriteMessages.as_view(), name="create"),
]
messages_form.html
{% extends "message/base.html" %}
{% block head_block %}
<title>Create Message</title>
{% endblock %}
{% block body_block %}
{% for message in messages %}
<h3><div class="text-center"><span class="label label-default">{{ message.message }}</span></div></h3>
{% endfor %}
<form method="POST" class="form-horizontal">
{% csrf_token %}
<div class="text-center" style="position: fixed; top: 500px;">
<span style="margin: 10px;">{{ form }}</span>
<br>
<input type="submit" value="Send" class="btn btn-primary btn-group btn-group-lg" >
</div>
</form>
{% endblock %}
messages_list.html:
<!DOCTYPE html>
{% extends "message/base.html" %}
{% block head_block %}
<title>Read Messages</title>
{% endblock %}
{% block body_block %}
<div class="">
{% for message in messages %}
<h3><div class="text-center"><span class="label label-default">{{ message.message }}</span></div></h3>
{% endfor %}
<br>
<p><div class="text-center"><a style="border: 1px solid gray;" class="btn btn-success" href="{% url 'create' %}">Write Message</a></div></p>
</div>
{% endblock %}
The basic idea is that I want to combine the "messages_form.html" and "messages_list.html" into one template file called "message.html".
Can anyone help me?
Upvotes: 0
Views: 551
Reputation: 38
I had something similar and here was my approach
views.py
from django.views import View
class MessageView(View):
template_name = 'message.html'
queryset = Messages.objects.all()
def get_queryset(self):
return self.queryset
def get(self, request, *args, **kwargs):
form = MessageForm()
context = {
'object_list': self.get_queryset(),
"form": form
}
return render(request, self.template_name, context)
def post(self, request, *args, **kwargs):
form = MessageForm(request.POST)
if form.is_valid():
form.save()
form = MessageForm()
return redirect('/message')
context = {
'object_list': self.get_queryset(),
"form": form
}
return render(request, self.template_name, context)
message.html
{% extends "message/base.html" %}
{% block head_block %}
<title>Message</title>
{% endblock %}
{% block body_block %}
{% for message in object_list %}
<h3><div class="text-center"><span class="label label-default">{{ message.message }}</span></div></h3>
{% endfor %}
<form method="POST" class="form-horizontal">
{% csrf_token %}
<div class="text-center" style="position: fixed; top: 500px;">
<span style="margin: 10px;">{{ form }}</span>
<br>
<input type="submit" value="Send" class="btn btn-primary btn-group btn-group-lg" >
</div>
</form>
{% endblock %}
Display your view in a url
urls.py
from django.urls import path
from .views import MessageView
urlpatterns = [
path('message', MessageView.as_view(), name='messages'),
]
Upvotes: 1