从 Django 的一页中获取选定单选按钮的值
Posted
技术标签:
【中文标题】从 Django 的一页中获取选定单选按钮的值【英文标题】:Taking value of selected radio buttons from one page in Django 【发布时间】:2021-01-19 07:29:54 【问题描述】:我想在单个页面中获取选定单选按钮的值。在这里解释一下是我在models.py文件中的代码
class Quiz(models.Model):
Description = models.CharField(max_length=200)
def __str__(self):
return str(self.Description)
class Question(models.Model):
Question_Text = models.CharField(max_length=500)
Option1 = models.CharField(max_length=100)
Option2 = models.CharField(max_length=100)
Option3 = models.CharField(max_length=100, blank=True)
Option4 = models.CharField(max_length=100, blank=True)
Answer = models.CharField(max_length=100)
QuizID = models.ForeignKey(Quiz, on_delete=models.CASCADE)
def __str__(self):
return str(self.Question_Text)
我希望用户从“Option1、Option2、Option3、Option4”字段中选择一个选项,并且我想获取所选单选按钮的值。
这是我的尝试:
disp.html
<form action="" method="post">
% csrf_token %
% for q in question %
q.Question_Text <br>
<input type="radio" id="question_ q.Option1 " name=" q.id " value=" q.Option1 ">
<label for="question_ q.Option1 "> q.Option1 </label> <br>
<input type="radio" id="question_ q.Option2 " name=" q.id " value=" q.Option2 ">
<label for="question_ q.Option2 "> q.Option2 </label> <br>
% if q.Option3 %
<input type="radio" id="question_ q.Option3 " name=" q.id " value=" q.Option3 ">
<label for="question_ q.Option3 "> q.Option3 </label> <br>
% endif %
% if q.Option4 %
<input type="radio" id="question_ q.Option4 " name=" q.id " value=" q.Option4 ">
<label for="question_ q.Option4 "> q.Option4 </label> <br>
% endif %
% endfor %
<br> <input type="submit" class="btn btn-primary" value="Submit">
</form>
现在我想获取所选单选按钮的值。由于记录的数量可能会有所不同,因此我无法手动获取所选单选按钮的值,例如:
first = request.POST.get("11")
second = request.POST.get("18")
third = request.POST.get("19")
这里11,18和19是问题模型中记录的id字段的值。
所以我尝试使用 for 循环按以下方式执行此操作,但我得到“无”作为值。
view.py
def disp(request):
quiz = get_object_or_404(Quiz, id = 4)
question = get_list_or_404(Question, QuizID = quiz)
if request.method == "POST":
for q in question:
response = request.POST.get("q.id")
print(response)
return render(request, 'quiz/disp.html', 'question' : question, 'quiz' : quiz)
请帮助我获取所选单选按钮的值,或者如果有其他方法可以获取所选单选按钮的值,请建议我
【问题讨论】:
【参考方案1】:我会重新配置 Question 模型以使用 Choices:
SOME = 'win'
OTHER = 'lin'
Answer_CHOICES = (
(SOME, 'Some Answer'),
(OTHER, 'Other Answer'),
)
class Question(models.Model):
....
Options = models.CharField(choices=Answer_CHOICES, max_length=100)
....
检查Choices field 以及如何使用它。另外,请检查crispy forms,它会自动为您处理表单输入。
【讨论】:
【参考方案2】:POST <QueryDict>
仅包含 <str>
类型的键。这意味着request.POST.get(18)
将返回None
而request.POST.get('18')
将返回值(假设密钥存在于POST <QueryDict>
中)。
if request.method == "POST":
for q in question:
# convert the q.id into str
response = request.POST.get(str(q.id))
print(response)
或
您可以遍历 POST 数据并检查有效密钥。因为,POST 数据包含其他数据,例如 csrfmiddlewaretoken。
将单选按钮名称属性的值改为question_ q.id
的形式。
<input type="radio" id="question_ q.Option1 " name="question_ q.id " value=" q.Option1 ">
循环POST,检查key是否包含question_
if request.method == "POST":
for k, v in request.POST.items():
if 'question_' in k:
# do something
【讨论】:
【参考方案3】:在 view.py 中,您使用“q.id”作为 HTTP 参数名称,而我认为您希望它是 11、18、19 等。试试这个:-
if request.method == "POST":
for q in question:
response = request.POST.get(q.id)
print(response)
【讨论】:
它仍在打印“None”作为值。 在此处共享整个 POST 数据(request.POST)。以上是关于从 Django 的一页中获取选定单选按钮的值的主要内容,如果未能解决你的问题,请参考以下文章
Django:在视图中使用选定的单选按钮的值来更新数据库中的值