【问题标题】:Django - Accessing object fields and names from class-based viewDjango - 从基于类的视图中访问对象字段和名称
【发布时间】:2011-08-02 16:39:00
【问题描述】:

我正在尝试为 Django 编写一个基于类的视图,它每次都会使用相同的模板,而不管模型如何。目的是我可以为每个模型添加一个 urls.py 条目,而不必为视图或模板而烦恼。

这将用于显示表单,并且由于表单字段名称取决于模型类型,因此需要在视图级别检查模型并提取字段名称,以便将它们传递给通用模板。然后模板根据对象的字段名称和值生成表单。

我一直在为此苦苦挣扎。目前我正在按如下方式覆盖 get_context_data

def get_context_data(self, **kwargs):
    context = kwargs
    context_object_name = self.get_context_object_name(self.object)
    if context_object_name:
        context[context_object_name] = self.object
    #add some custom stuff on too
    tempdict = [(field, field.value_to_string(self)) for field in self.object._meta.fields]
    #context.update({'datafields' : tempdict})
    context.update({ 'blarg': 'tester!!'})
    return context

self.object._meta.fields 位是我遇到问题的地方。我只是不知道如何访问当前模型。我在一个视图中这样做,我在 mixin 中还有什么运气吗?

感谢您的宝贵时间。

【问题讨论】:

    标签: python django model


    【解决方案1】:

    我认为你的做法是错误的。 Django 已经知道如何从模型创建表单,并且表单知道如何输出自己。所以你可以使用ModelFormMixin 创建一个标准的通用视图,不需要做任何聪明的事情来获取模型字段的表单字段。

    唯一困难的一点是您希望一个视图适用于多个模型。因此,与其在视图类上显式声明模型,您需要制定一些动态传递模型的方法——也许通过覆盖get_object

    【讨论】:

    • 感谢丹尼尔的回复。我的问题不在于它本身是一个表单(例如,我们可以假装我只想显示对象的字段和值的表格),而是我想制作一个适用于所有数据的模板类型,正如您在第二段中提到的那样。我会看看覆盖 get_object 看看我能想出什么 - 干杯!
    • 最终覆盖 get_object 并让它返回字典。手动添加到上下文并渲染,一切看起来都不错:) 干杯
    【解决方案2】:

    如果您使用的是 django 1.3,则包含基于类的视图...只需使用它们并将 'template_name' 属性设置为您的“通用”名称。

    https://docs.djangoproject.com/en/1.3/topics/class-based-views/

    【讨论】:

      猜你喜欢
      • 2021-06-28
      • 1970-01-01
      • 2011-07-30
      • 2016-12-25
      • 1970-01-01
      • 2018-04-13
      • 2011-08-14
      • 1970-01-01
      • 2012-06-29
      相关资源
      最近更新 更多