【问题标题】:Passing variable from django template to view从 django 模板传递变量到视图
【发布时间】:2015-05-23 02:22:12
【问题描述】:

我正在使用 django 1.7 构建我的第一个站点,并且很难弄清楚如何将变量从点击传递到视图。我的 GET 也是空的。

我的模板有一个包含 Facebook 帐户 ID 的表格,点击后应显示用户管理员的 Facebook 页面列表。

我的模板:

{% for SocialAccount in accountlist %}
   <tr>
      <td><a href="{% url 'INI:fbpages' %}">{{ SocialAccount.uid }}</a></td>
      <td>{{ SocialAccount.extra_data.first_name }}</td>
      <td>{{ SocialAccount.extra_data.last_name }}</td>
      <td>{{ SocialAccount.extra_data.email }}</td>
   </tr>
{% endfor %}

我的看法:

def fbpages(request, fbuser):
    djuser = request.user.id
    context = RequestContext(request)
    fbuser = 1234634
    pagelist = facebook.pages(request, djuser, fbuser)
    blocks = {'title': 'Facebook Pages',
          'pagelist': pagelist}
    return render(request, "initiative/ListFBPages.html", blocks)

如果我将 ID 放在 URL 中,我可以轻松做到这一点,但我不想在 url 中公开页面/用户 ID。我觉得有一个简单的解决方案,但我还没有弄清楚。

感谢您的帮助。

【问题讨论】:

  • 在 Django 中没有特殊的方法可以做到这一点。这只是基本的 HTTP。使用表格。不希望它在 URL 中?使用POST 请求。

标签: django


【解决方案1】:

您只能通过 4 种不同的方法从模板向 Django 视图发送数据。在您的情况下,如果您不想要 URL 中的信息,您可能只能使用选项 1 和 4。

因为我是 StackOverflow 的新手,所以我不能发布超过 2 个链接,所以如果 你搜索下面的帖子你会发现更多关于 每种方法的优缺点。

"什么是从模板传递变量到视图的更有效的方法 在 django 中"

1.发布

所以你会提交一个带有值的表单。

    # You can retrieve your code in your views.py via
    request.POST.get('value')

2。查询参数

所以你会通过 //localhost:8000/?id=123

    # You can retrieve your code in your views.py via
    request.GET.get('id')

3.来自 URL(例如参见 here

所以你会通过 //localhost:8000/12/results/

    # urls.py
    urlpatterns = patterns(
        ...
        url(r'^(?P<question_id>\d+)/results/$', views.results, name='results'),
        ...
    )

在你看来……

    # views.py
    # To retrieve (question_id)
    def detail(request, question_id):
        ...
        return HttpResponse("blahblah")

4.会话(通过 cookie)

使用会话的缺点是您必须将其传递给视图或提前设置。

https://docs.djangoproject.com/en/1.7/topics/http/sessions/

    # views.py
    # Set the session variable
    request.session['uid'] = 123456

    # Retrieve the session variable
    var = request.session.get['uid']

【讨论】:

  • 谢谢小丑。我想我会选择选项 1。我以前使用过 url,它运行良好,但我不希望用户操纵 url 来查看其他用户的页面和链接的帐户。我试图尝试使用需要权限的装饰器,但我认为我的技能仍然太初学者。
  • 你能扩展一下第二种方法吗?更具体地说,如何在模板中设置查询参数(如果是“?...”)?
  • 第二种方法是通过 url 参数传递一个变量。例如,如果你这样做了。 127.0.0.1:8000/page/?id=200 你可以使用 request.GET.get('id') 来获取 id 变量。在这种情况下 request.GET.get('id') 将返回“200”。
  • 好答案。虽然我希望您对方法 1 更具体一些。我正在其他地方寻找有关使用方法 1 的说明,但还没有弄清楚。
【解决方案2】:

为了补充 JJK 的答案,这里是使用表单将变量从模板传递到视图的详细方法。

模板:

<form action="{% url 'INI:fbpages' SocialAccount.uid %}" method="post">
..
</form>

上面,'INI:fbpages' 是 urls.py 中定义的 url 模式名称

SocialAccount.uid 是您要传递给视图的变量。

注意,这里没有使用django模板中变量渲染中使用的双花括号。

查看:

这个变量可以作为fbuser命令参数在视图中直接访问

def fbpages(request, fbuser):
..

【讨论】:

    【解决方案3】:

    我们也这样使用:

    from django.urls import path
    from . import views
    
    urlpatterns = [
           path('articles/2003/', views.special_case_2003),
           path('articles/<int:year>/', views.year_archive),
           path('articles/<int:year>/<int:month>/', views.month_archive),
           path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
    ]
    

    【讨论】:

    • 我们如何在视图中访问年份(例如)?
    猜你喜欢
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    相关资源
    最近更新 更多