访问 generic.DetailView 中的模型实例

lam*_*ter 5 django django-views

有没有办法在模板渲染之前访问将在views.py 中的 generic.DetailView 中呈现的模型实例?就像这里的假设函数:

class MyModelDetailView(LoginRequiredMixin, generic.DetailView):
    model = MyModel
    template_name_suffix = '_details'

    def do_some_initial_stuff(model_instance):
        # do stuff to model_instace, 
        # like assigning fields, creating context variables based on existing fields, etc.
Run Code Online (Sandbox Code Playgroud)

最终,我希望用户单击一个模板中特定模型实例的按钮,然后定向到此 generic.DetailView 模板,其中模型显示其一些字段值已更改以及其他一些内容(例如模型可能有一个字段确认该用户单击了上一个模板中的按钮)。有关最有效方法的建议将不胜感激。谢谢 :)

Ajm*_*had 4

如果您只想在上一个视图中单击按钮时才进行某些更改,那么您可以使用 Django会话。将所需的值添加到会话字典中。

  request.session['button_clicked'] = True
Run Code Online (Sandbox Code Playgroud)

要在视图的当前上下文中进行更改,可以通过重写 get_context_data() 来完成。

喜欢:

class MyModelDetailView(LoginRequiredMixin, generic.DetailView):
    model = MyModel
    template_name_suffix = '_details'

    def get_context_data(self):
        context = super(MyModelDetailView, self).get_context_data()
        # Object is accessible through self.object or self.get_object()
        if request.session.pop('button_clicked', False):
             myobject = self.object
             # The alteration you make on myobject wont be saved until you save it using myobject.save()

            # Alter the object using myobject and alter the context varible like this:
             context['object'] = myobject
             context['myvar'] = "My  Variable"
        # Then return 
        return context
Run Code Online (Sandbox Code Playgroud)

有关 Django 会话的更多信息:https://docs.djangoproject.com/en/1.11/topics/http/sessions/