【问题标题】:How to pass a variable from one view to another in Django如何在Django中将变量从一个视图传递到另一个视图
【发布时间】:2019-03-24 13:30:12
【问题描述】:

我想在 Django 中将变量从一个视图传递到另一个视图,但不确定最佳方法。

下面的“defaultCreateView”是一个创建新数据库条目的表单,并且有一个我想自动填写的必填字段(device_id)。所以我的想法是我可以在 URL 中传递它。使用下面我的模板中显示的按钮访问此表单。所以想法是第一个视图将变量传递给按钮所在的模板,然后这个按钮通过href将device_id添加到URL。

有没有更简单/更好的方法来实现这一点?

提前感谢您的帮助。

urls.py

urlpatterns = [
    path('<int:pk>/edit/', defaultUpdateView.as_view(), name='default_edit'),
    path('<int:pk>/', defaultDetailView.as_view(), name='default_detail'),
    path('<int:pk>/delete/', defaultDeleteView.as_view(), name='default_delete'),
    path('<int:device>', DefaultsListView.as_view(), name='Default_Listview'),
    path('<int:device>/new/', defaultCreateView.as_view(), name='default_new'),
    path('Defaultsapidata/', apiDefaultsListView.as_view(), name='Defaults_apidata_list'),
    path('<int:pk>/changedefaults/', changeDefaultsViewSingle.as_view()),
]

Views.py

class DefaultsListView(LoginRequiredMixin,ListView):
    model = models.DefaultDMLSProcessParams
    template_name = 'defaults_list.html'
    login_url = 'login'
    def get_queryset(self):
        return super(DefaultsListView, self).get_queryset().filter(device_id=self.kwargs['device'])

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        deviceID = self.kwargs['device']
        context['deviceID'] = deviceID
        return context

class defaultCreateView(LoginRequiredMixin,CreateView):
    model = models.DefaultDMLSProcessParams
    template_name = 'default_new.html'
    fields= ['defaultParamDescrip','processType','processNotes',]
    login_url = 'login'

    def form_valid(self, form):
        form.instance.customerTag = self.request.user.customerTag 
        form.instance.device_id = self.kwargs['device']
        return super().form_valid(form)

defaults_list.html

<a class="btn btn-primary btn-lg" 
href="{% url 'default_new' {{deviceID}}  %}" role="button"> Add New Default Parameter</a>

编辑 当我尝试访问 defaults_list.html 时,我得到一个“NoReverseMatch at /defaults/41”,但是当我将 defaultCreateView 的 URL 更改为:

        path('new/', defaultCreateView.as_view(), name='default_new'),

【问题讨论】:

  • 它试图访问什么路径。
  • 我编辑了上面的帖子。事实证明,我通过尝试将 添加到 defaultCreateView 的 URL 中得到了 noReverseMatch

标签: django django-forms django-templates django-views


【解决方案1】:
def update_project_filter(request):
...
selected_project_id = project_form.cleaned_data["Project_Name"].id
request.session['selected_project_id'] = selected_project_id
...

def update_project(request):
...
selected_project_id = request.session.get('selected_project_id')
...

假设您已激活“django.contrib.sessions.middleware.SessionMiddleware”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 2016-09-28
    相关资源
    最近更新 更多