如何在Django开发的问卷中显示供用户选择的情绪对应图片
核心问题排查与解决方案
1. 模板图片分支未触发(仅显示图片名称的直接原因)
你视图函数的返回上下文里没有传入questionnaire对象,模板中{% if questionnaire.name == 'Pick-a-Mood' %}判断永远为假,直接走了普通问卷的else分支,仅渲染答案文本,根本没执行图片渲染的代码。
修复方法:
在take_questionnaire_fs视图中先获取问卷对象,再传入模板:
from django.shortcuts import get_object_or_404 def take_questionnaire_fs(request, questionnaire_id): # 新增下面这行获取问卷对象 questionnaire = get_object_or_404(Questionnaire, id=questionnaire_id) # 原有逻辑不变 ... # 修改返回的上下文,加入questionnaire return render(request, 'questionnaires/take_questionnaire_fs.html', { 'questionnaire': questionnaire, 'questions': questions, 'answers': answers, })
2. 静态文件引用不规范
你当前硬编码了静态资源路径,容易因为配置问题加载失败:
- 首先在模板最顶部(
{% extends "base.html" %}之后)加入静态文件加载标签:
{% load static %}
- 把所有图片的
src属性替换为Django静态模板标签写法,例如:
<!-- 替换前 --> <img src="/static/mysurveys/female_neutral.png"> <!-- 替换后 --> <img src="{% static 'mysurveys/female_neutral.png' %}" alt="neutral">
- 检查项目静态文件配置:
settings.py确保存在以下配置:
STATIC_URL = 'static/' # 静态文件存放目录,确保你的情绪图片放在项目根目录/static/mysurveys/下 STATICFILES_DIRS = [BASE_DIR / 'static']- 开发环境下需要在根
urls.py末尾加上静态文件路由:
from django.conf import settings from django.conf.urls.static import static urlpatterns = [ # 原有路由不变 ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
3. 情绪问卷提交逻辑适配
你当前情绪问卷的表单字段名是pickamood,和通用formset要求的字段格式不匹配,提交后会校验失败无法保存结果,需要在视图中单独处理该问卷的提交逻辑:
修改视图的POST处理部分:
def take_questionnaire_fs(request, questionnaire_id): questionnaire = get_object_or_404(Questionnaire, id=questionnaire_id) ResponseFormSet = modelformset_factory(Response, form=ResponseForm, extra=0) if request.method == 'POST': # 新增情绪问卷单独处理逻辑 if questionnaire.name == 'Pick-a-Mood': selected_mood = request.POST.get('pickamood') # 匹配对应的答案和问题 target_answer = Answer.objects.filter(questionnaire=questionnaire, text__iexact=selected_mood).first() target_question = Question.objects.filter(questionnaire=questionnaire).first() if target_answer and target_question: Response.objects.create( user=request.user, question=target_question, answer=target_answer ) return HttpResponseRedirect(reverse ('questionnaires:questionnaire_index')) # 原有普通问卷的formset逻辑不变 else: formset = ResponseFormSet(request.POST, form_kwargs={'user': request.user}) if formset.is_valid(): formset.save() return HttpResponseRedirect(reverse ('questionnaires:questionnaire_index')) else: print("Formset is NOT valid") print(formset.errors) print(formset.non_form_errors()) # 原有GET逻辑不变 ...
内容的提问来源于stack exchange,提问作者AllyZ
相关产品推荐
相关产品推荐

