关于 python:Django – 从基于类的视图中访问对象字段和名称

 2022-02-13 

Django - Accessing object fields and names from class-based view

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

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

我一直在为此苦苦挣扎。目前我正在重写 get_context_data 如下

1
2
3
4
5
6
7
8
9
10
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 中还有更多的运气吗?

感谢您的宝贵时间。

O


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

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


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

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