在模板中生成Django表单返回forms.instance

在模板中生成Django表单返回forms.instance,django,django-forms,Django,Django Forms,我对我的用户具有复杂的用户定义权限。但为了简化思考,让我们设想每个用户只有只读或写权限 我正在使用Django表单编辑和保存模型对象。我的目标是在Django HTML模板中为那些有权编辑给定模型实例的用户呈现,如果用户只有只读权限,则呈现硬编码数据(不带标记) 目前,我的Django模板中有以下代码来实现这一点: {%if user.has_permission_to_edit %} {{my_form.my_field}} {% else %} {{my_form.insta

我对我的用户具有复杂的用户定义权限。但为了简化思考,让我们设想每个用户只有
只读
权限

我正在使用Django表单编辑和保存模型对象。我的目标是在Django HTML模板中为那些有权编辑给定模型实例的用户呈现
,如果用户只有只读权限,则呈现硬编码数据(不带
标记)

目前,我的Django模板中有以下代码来实现这一点:

{%if user.has_permission_to_edit %}
    {{my_form.my_field}}
{% else %}
    {{my_form.instance.my_field}}
{% endif %}
这是我的表格:

class MyForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)   
        for field_name, field in self.fields.items():
            field.widget.attrs['class'] = 'form-control input-sm'
            if field.required == True: 
                field.widget.attrs['required'] = ''
    class Meta:
        model = MyModel
        fields = ('my_field',)

模板中代码的问题是我必须使用多个{%if%}{%else%}块。我对Django比较陌生,而且我知道有太多的高级工具使得Django代码可能非常枯燥,所以我想问你们,组织我在模板中描述的内容的最枯燥的方法是什么。具体来说,是否有任何方法可以使Django表单根据表单定义中指定的某些条件返回实例值?或者我必须使用一些已定义的标记吗?或者可能使用了完全不同的体系结构来实现这些目标?

从您的问题中我了解到,您希望传递从数据源获取的数据实例

from .forms import MyForm
from django.shortcuts import render
假设您已经在views.py级别创建了forms.py文件

从数据源获取数据(详细信息如下例中的模型)

现在,一旦我们的reg_form参数中有了数据,我们就可以将其传递到模板中

return render(request, 'applicant/register.html', { 'my_form' : reg_form})
做任何你想做的事,在模板中使用我的表单变量

基于更新的问题

可以将参数传递给窗体的init函数

reg_form = MyForm(exist = exist, some_param = param_value, instance=detail_instance or None)
传递参数后,可以在表单的init函数中获取和处理参数

class MyForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        exist = kwargs.pop('exist', None)
        pk_reg = kwargs.pop('param', None)
        super(MyForm, self).__init__(*args, **kwargs)
        #do some stuff with you custom params here
        if exist == True or pk_reg:
            self.fields['username'].widget.attrs['readonly'] = True

上述方法还有另一种选择,即使用单独的表单获得单独的权限,并根据用户权限调用相应的表单。

我不确定我是否理解您想要实现的目标?您正在编辑模型对象吗?如果用户有编辑权限,行为如何改变?您希望在哪种类型的字段中显示硬编码值?它是文本字段吗?嗯,它可以是文本字段、数值、复选框…任何内容。基于各个模型字段类型的类型
class MyForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        exist = kwargs.pop('exist', None)
        pk_reg = kwargs.pop('param', None)
        super(MyForm, self).__init__(*args, **kwargs)
        #do some stuff with you custom params here
        if exist == True or pk_reg:
            self.fields['username'].widget.attrs['readonly'] = True