代码之家  ›  专栏  ›  技术社区  ›  Mike Vlad

Django UpdateView泛型类

  •  1
  • Mike Vlad  · 技术社区  · 6 年前

    如何访问用户在通用视图类中传递的对象?

    在模板中,当用户单击链接时:

    <td><a href="{% url 'update_peon' pk=item.pk %}"><button class="btn btn-warning">Edit</button></a></td>
    

    这将转到urls.py:

    url(r'^update_peon/(?P<pk>\d+)$', views.UpdatePeon.as_view(), name='update_peon'),
    

    我的观点是:

       class UpdatePeon(generic.UpdateView):
    
            login_required = True
            template_name = 'appform/Peons/peon_form.html'
            model = Person
            form_class = PersonForm
            success_url = reverse_lazy('view_peons')
    

    我想进入 item.attr1 或者至少 item.pk 在课堂上,我可以相应地改变模型和形式,比如:

       class UpdatePeon(generic.UpdateView):
    
            login_required = True
            template_name = 'appform/Peons/peon_form.html'
    
            if item['attr1'] == "Attribute1":
                model = model1
                form = model1Form
            else:
                 etc
    
            success_url = reverse_lazy('view_peons')
    

    我知道如何在一个普通的基于函数的类中完成它,或者即使我从头重写了一个基于类的视图,但我不想这样做。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Alasdair    6 年前
    class UpdatePeon(generic.UpdateView):
        if item['attr1'] == "Attribute1":
            model = model1
            form = model1Form
        else:
            ...
    

    你不能像这样把代码放到类体中。它在加载模块时运行,然后才能访问 request .

    您应该重写一个特定的方法。例如,您可以覆盖 get_form_class 更改视图使用的窗体类。在视图中,可以访问正在更新的对象 self.object .

    class UpdatePeon(generic.UpdateView):
        def get_form_class(self):
            if self.object.pk == 1:
                return MyForm
            else:
                return OtherForm
    

    您可能会发现CCBV网站对于探索 update view methods .