【问题标题】:How to send object from detail view to another view in Django?如何将对象从详细视图发送到 Django 中的另一个视图?
【发布时间】:2019-08-31 16:48:10
【问题描述】:

我有一个详细视图,它使用 Quiz 对象来显示存储在该对象中的数据,例如标题和作者。我想要一个链接到一个新页面的按钮,该页面显示来自同一对象的不同数据。我不知道如何传递这个数据/对象。

我可以渲染视图并使用 id 将特定测验的上下文传递给它,但我希望将 id 更改为初始页面中对象的 id。

#assessement view
def assessment(request):
    context = {
        'quiz':Quiz.objects.get(id=1),
    }
    return render(request, 'quiz_app/assessment.html', context)

#detailview template for quiz
{% extends "quiz_app/base.html" %}
{% block content %}
        <article class="quiz-detail">
            <h1>{{ object.title }}</h1>
            <h2>{{ object.question_amount }} Questions</h2>
            <a class="btn" href="{% url 'quiz-assessment' %}">Start Quiz</a>
        </article>
{% endblock content %}

#assessment template
{% extends "quiz_app/base.html" %}
{% block content %}
    <h2>Assessment</h2>
    <h2>Title is {{ quiz.title }}</h2>
{% endblock content %}

【问题讨论】:

  • 我们可以知道您使用的是哪个版本的 django 吗?
  • 您必须将数据作为 URL 的一部分传递。让您的quiz-assessment URL 采用一个 URL 参数,该参数采用测验的 id,然后在评估页面的视图中获取它。
  • 版本是2.2.4

标签: python django templates django-views


【解决方案1】:

然后您应该为 url quiz-assessment 创建另一个视图,并像上面在 assessment 视图中所做的那样通过测验 pk。

 def quiz_assessment(request,pk):
         quiz = Quiz.objects.get (pk=pk)
         return render (request,'assessment_template', {'quiz':quiz}

在您的网址中,像这样传递测验 id:

         path ('<int:pk>/quiz/assessment /',views.quiz_assessment,name='quiz_assessment')

在您的模板中,您可以提供这样的网址:

        < a class="btn" href="{% url 'quiz_assessment' object.pk %}>

【讨论】:

    【解决方案2】:

    正如@Robin Zigmond 在 cmets 中所建议的那样,您可以这样做。

    #assessement view
    def assessment(request, qid):
        context = {
            'quiz':Quiz.objects.get(id=qid),
        }
        return render(request, 'quiz_app/assessment.html', context)
    

    在 HTML 文件中

    #detailview template for quiz
    {% extends "quiz_app/base.html" %}
    {% block content %}
            <article class="quiz-detail">
                <h1>{{ object.title }}</h1>
                <h2>{{ object.question_amount }} Questions</h2>
                <a class="btn" href="{% url 'quiz-assessment' qid=object.id %}">Start Quiz</a>
            </article>
    {% endblock content %}
    

    并在您的 urls.py 中更改为:

    path('quiz_asswssment/?P<int:qid>/', views.assessment, name="quiz_assessment")
    

    【讨论】:

      【解决方案3】:

      此外,SammyJ 的建议是,您可以使用 django 会话库或 django 缓存框架。您可以临时存储下一个视图所需的信息,并随时访问。

      按照 Sammy J 的建议,您将始终确保查询集在上下文中传递,否则将不会呈现。

      def assesment(self, request, id):
          q = Quiz.objects.get(pk=id)
          request.session["someData"] = q.name
          request.session["qAmount] = q.amount
      

      在您的模板文件中

      <p>The title is : {{request.session.title}} and the amount is {{request.session.qamount}}
      

      注意:Django 会话不允许您将查询集设置为会话记录,为此,您可以使用 Django Cache 框架。

      例子

      from django.core.cache import cache
      cache.set('quiz', q)
      getting cache -> cache.get('quiz')
      
      

      会话框架文档:https://docs.djangoproject.com/en/2.2/topics/http/sessions/

      缓存框架文档:https://docs.djangoproject.com/en/2.2/topics/cache/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-06
        • 2020-10-30
        • 1970-01-01
        • 1970-01-01
        • 2019-05-24
        相关资源
        最近更新 更多