在模板中生成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