Как перечислить информацию на другой странице для формы
Я пытаюсь сделать страницу с вопросами, где пользователь может щелкнуть на ID вопроса. После нажатия они будут перенаправлены на другую страницу для ответа на этот вопрос с появлением текста вопроса и отображением вопросов с множественным выбором. Как мне это сделать?
На данный момент у меня есть следующее
При нажатии на цифру один пользователь перейдет к вопросу с несколькими вариантами ответа на этот вопрос и текстом вопроса
Model
from asyncio import FastChildWatcher
import email
from pyexpat import model
from xxlimited import Null
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
class userCouncil(BaseUserManager):
def create_user(self, userID, password=None):
if not email:
raise ValueError("Email is required")
user = self.model(userID = self.normalize_email(userID))
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, userID, password):
user = self.model(userID = self.normalize_email(userID))
user.set_password(password)
user.is_staff = True
user.is_admin = True
user.save(using=self._db)
return user
class sni(models.Model):
SNI = models.CharField(max_length=256, primary_key=True)
Used = models.IntegerField(null=True, blank=True)
password = None
USERNAME_FIELD = 'SNI'
def __str__(self):
return self.SNI
class Account(AbstractBaseUser):
userID = models.EmailField(primary_key= True ,max_length=256, unique=True)
name = models.CharField(max_length=100)
dateOfBirth = models.DateField(max_length=8, null=True)
homeAddress = models.CharField(max_length=100, null=True)
is_staff = models.BooleanField(default=False)
is_admin = models.BooleanField(default=False)
sni = models.OneToOneField(sni, on_delete=models.CASCADE, null=True, blank=True)
USERNAME_FIELD = 'userID'
objects = userCouncil()
def __str__(self):
return self.userID
def has_perm(self, perm, obj=None):
return self.is_admin
def has_module_perms(self, app_label):
return True
class Question(models.Model):
QuestionsID = models.AutoField(primary_key=True, unique=True)
QuestionText = models.CharField(max_length=256, null = True)
def __str__(self):
return str(self.QuestionsID)
class Option(models.Model):
OptionID = models.AutoField(primary_key=True, unique=True)
OptionText = models.CharField(max_length=256, null=True)
QuestionsID = models.ForeignKey(Question, on_delete=models.CASCADE)
def __str__(self):
return str(self.OptionID)
class Result(models.Model):
ResponseID = models.AutoField(primary_key=True, unique=True)
userID = models.ForeignKey(Account, on_delete=models.CASCADE)
QuestionsID = models.ForeignKey(Question, on_delete=models.CASCADE)
ChosenOptionID = models.ForeignKey(Option, on_delete=models.CASCADE)
def __str__(self):
return str(self.ResponseID)
View
from telnetlib import LOGOUT
from django.shortcuts import redirect, render
from django.http import HttpResponse
from matplotlib import use
from matplotlib.pyplot import get
from matplotlib.style import context
from werkzeug import Request
from .models import Account, Question, sni
from django.contrib.auth.hashers import make_password, check_password
from django.contrib.auth.forms import UserCreationForm
from django.contrib import messages
from django.contrib.auth import authenticate, logout
from django.contrib.auth import login as dj_login
from django.forms import ModelForm, forms
from django.contrib.auth.decorators import login_required
from .forms import AccountAuthenticationForm, SNIForm, createUserForm
def login(request):
context = {}
if request.method == 'POST':
username = request.POST.get('username').lower()
password = request.POST.get('password')
user = authenticate(request, userID = username, password = password)
form = AccountAuthenticationForm(request.GET)
if user is not None:
dj_login(request, user)
return redirect('dashboardPage')
else:
messages.info(request, "userID or password is incorrect")
return render(request, 'base.html', context)
def registerPage(request):
form = createUserForm()
form2 = SNIForm()
if request.method == 'POST':
form = createUserForm(request.POST)
form2 = SNIForm(request.POST)
if form.is_valid() and form2.is_valid:
snival = form2.data['SNI']
print(snival)
if sni.objects.filter(SNI = snival, Used = 1).exists():
form.save()
userID = form.cleaned_data.get('userID')
messages.success(request, "Account created for: " + userID)
return redirect('loginPage')
context = {'form' : form, 'form2' : form2}
return render(request, 'register.html', context)
@login_required(login_url='loginPage')
def dashboardPage(request):
context = {'Questions': Question.objects.all}
return render(request, 'dashboard.html', context)
def logout_view(request):
logout(request)
messages.success(request, "You were logged out!")
return redirect("loginPage")
приборная панель html
Я не хочу писать за вас код, но я готов дать вам идею подхода к решению вашей проблемы.
Ваш вопрос в вашем комментарии,
Использую ли я параметр запроса, а затем устанавливаю идентификатор вопроса в качестве ссылки href?
в основном, "ДА!
".Добавьте представление AnswerPage и HTML-шаблон, который будет принимать идентификатор конкретного вопроса, который вы передадите через url со страницы приборной панели. Затем отфильтруйте опции, которые относятся к этому вопросу:
@login_required(login_url='loginPage')
def dashboardPage(request):
context = {'Questions': Question.objects.all()}
return render(request, 'dashboard.html', context)
@login_required(login_url='loginPage')
def answerPage(request, questions_id):
question = Question.objects.get(QuestionsID = questions_id)
options = Option.objects.filter(QuestionsID = question)
if request.method == 'POST':
# here you can put the code that will get the results and save them
context = {
'question': question,
'options': options
}
return render(request, 'answer.html', context)
На вашей странице приборной панели должны быть урлы, по которым идентификатор вопроса будет передаваться в ответСтраница просмотра:
dashboard.html
...
{% for q in Questions %}
<h6><a href="{% url 'answerPage' q.QuestionID %}">{{ q.QuestionsID }}</a>: {{ q.QuestionText }}</h6>
{% endfor %}
...
Затем ваша страница answer.html может распечатать этот конкретный вопрос и варианты, которые вы передали:
answer.html
...
<div>{{ question }}</div>
{% for option in options %}
<input type="radio" id="{{ option.OptionID }}" name="result" value="{{ option.OptionId }}">
<label for="{{ option.OptionID" }}>{{ option.OptionText }}</label><br>
{% endfor %}
...
Теперь вам предстоит взять эти ответы и обработать их так, чтобы результаты были сохранены.
