You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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">
  • 检查项目静态文件配置:
    1. settings.py确保存在以下配置:
    STATIC_URL = 'static/'
    # 静态文件存放目录,确保你的情绪图片放在项目根目录/static/mysurveys/下
    STATICFILES_DIRS = [BASE_DIR / 'static']
    
    1. 开发环境下需要在根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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 10:06:03