【问题标题】:How To Access Model Class Variable in Django Admin Change Form Template Before Save如何在保存前访问 Django Admin 更改表单模板中的模型类变量
【发布时间】:2016-07-20 22:57:08
【问题描述】:

假设我有一个模型,其中有一个名为documentation 的类变量。我想访问给定模型更改表单模板中的documentation 类变量。我怎样才能做到这一点?保存实例后,我可以使用{{original.documentation}} 访问模板中的类变量。

示例模型

class Person(models.Model):
    # How do I access this variable in my change form template 
    # before saving the new instace?
    documentation = "The Person model will be used for all staff including researchers, professors, and authors."

    first_name = models.CharField(max_length=255)

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    这可以通过更新 ModelAdmin 类https://docs.djangoproject.com/en/dev/ref/contrib/admin/#other-methods 中的 Django 视图方法来完成。

    def add_extra_context(model, kwargs):
            kwargs.setdefault("extra_context", {})
            kwargs["extra_context"]["documentation"] = model.__dict__.get('documentation','')
    
    
    class DocumentableAdmin(admin.ModelAdmin):
        def add_view(self, *args, **kwargs):
            add_extra_context(self.model, kwargs)
            return super(DocumentableAdmin, self).add_view(*args, **kwargs)
    
        def changelist_view(self, *args, **kwargs):
            add_extra_context(self.model, kwargs)
            return super(DocumentableAdmin, self).changelist_view(*args, **kwargs)
    
        def change_view(self, *args, **kwargs):
            add_extra_context(self.model, kwargs)
            return super(DocumentableAdmin, self).change_view(*args, **kwargs)
    
    admin.site.register(Person, DocumentableAdmin)
    

    现在模型中定义的文档类变量将在更改表单管理模板中可用,可使用{{ documentation|safe }}访问

    【讨论】:

      【解决方案2】:

      您可以为此使用ModelForms。创建一个表单并在您的视图中引用它,例如formname = forms.formname()。他们可以使用{formname} 标签显示整个表单。

      最好在 forms.py 中操作变量而不是模板。但是,如果需要,您可以通过在视图类中定义 get_context_data(self, **kwargs) 函数来访问模板中的变量,例如:

      def get_context_data(self, **kwargs):
              context = super(view_name, self).get_context_data(**kwargs)
              context['model_field_list'] = Modelname.objects.get(pk=self.kwargs["modelname_pk"])
              return context
      

      现在您可以在模板中使用{model_field_list.fieldname} 标签访问您的变量。在此处查看有关 get_context_data 函数的文档:documentation

      【讨论】:

        猜你喜欢
        • 2013-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多