So I am building this debate app where a question is posted and the user chooses the option to agree,disagree or have a neutral opinion. When the user chooses the option I want them to type the reason in textbox after choosing the option and then submit. After submitting they get to see other users choice. I have build until choosing the options in the vote page and displaying the result but I could not get the textbox. here is my models.py
from django.db import models
from django.conf import settings
from django.contrib.auth.models import User
class Poll(models.Model):
question = models.TextField()
option_one = models.CharField(max_length=30)
option_two = models.CharField(max_length=30)
option_three = models.CharField(max_length=30)
option_one_count = models.IntegerField(default=0)
option_two_count = models.IntegerField(default=0)
option_three_count = models.IntegerField(default=0)
#point = models.TextField()
def total(self):
return self.option_one_count + self.option_two_count + self.option_three_count
class textbox_model(models.Model):
Poll = models.ForeignKey(Poll,on_delete=models.CASCADE)
body = models.TextField(max_length = 5000 , null=False,blank=False)
author = models.ForeignKey(User,on_delete=models.CASCADE)
def __str__(self):
return self.body
forms.py
from django.forms import ModelForm
from .models import Poll,textbox_model
from django import forms
class CreatePollForm(ModelForm):
class Meta:
model = Poll
fields = ['question', 'option_one', 'option_two', 'option_three']
class EditTextbox(forms.ModelForm):
class Meta:
model = textbox_model
fields = ('body',)
widgets = {
'body': forms.Textarea(attrs={'class':'form-control'}),
}
views.py
def vote(request, poll_id):
poll = Poll.objects.get(pk=poll_id)
if request.method == 'POST':
selected_option = request.POST['poll']
if selected_option == 'option1':
poll.option_one_count += 1
elif selected_option == 'option2':
poll.option_two_count += 1
elif selected_option == 'option3':
poll.option_three_count += 1
else:
return HttpResponse(400, 'Invalid form option')
poll.save()
return redirect('debateapp:results', poll.id)
context = {
'poll' : poll
}
return render(request, 'debateapp/vote.html', context)
# to insert textbox in the vote page and show the text in the results page
def textbox(request):
context ={}
# add the dictionary during initialization
form = EditTextbox(request.POST or None)
if form.is_valid():
form.save()
context['form']= form
return render(request, "debateapp/vote.html", context)
def results(request, poll_id):
poll = Poll.objects.get(pk=poll_id)
context = {
'poll' : poll
}
return render(request, 'debateapp/results.html', context)
urls.py
path('', views.home, name='home'),
path('results/<poll_id>/', views.results, name='results'),
path('vote/<poll_id>/', views.vote, name='vote'),
What I have tried:
I have tried to create a model named"textbox" and using foreign key I have connected it to the poll. I have created function in views.py named "textbox" and by using forms I tried to display it.
In my vote.html page I have added
{{textbox_model.body}}
. In my results.html page I have added
<li >{{textbox_model.body}}</li>
.