我有一个表单,我需要在管理区域之外显示我的项目,某些字段无法编辑但可以看到它们。
要做到这一点会很棒" AdminReadonlyField "发现在" django.contrib.admin.helpers" 问题在于你无法做到。
我试图创建一些可以替换这个复杂类的小部件,但我无法使它与DateTiemField字段一起正常工作。
class UserUpdateForm(forms.ModelForm):
"""
We need field "date_joined" can not be edited but can see them
"""
class Meta:
model = User
fields = ('first_name', 'last_name',
'email', 'date_joined', 'slug')
def __init__(self, user, *args, **kwargs):
kwargs['instance'] = user
super(UserUpdateForm, self).__init__(*args, **kwargs)
self.fields['date_joined'].widget = widgets.CMDateTimeText()
def clean_date_joined(self):
instance = getattr(self, 'instance', None)
if instance and instance.pk:
return instance.date_joined
else:
return self.cleaned_data['date_joined']
我的代码,有些不对劲。
class CMDateTimeText(DateTimeBaseInput):
"""
A SplitDateTime Widget that has some admin-specific styling.
Hereda Field and Widget.
"""
format_key = 'DATETIME_FORMAT'
def __init__(self, attrs=None, format=None):
# Use slightly better defaults than HTML's 20x2 box
default_attrs = {'class': 'date_id'}
if attrs:
default_attrs.update(attrs)
super(CMDateTimeText, self).__init__(attrs=default_attrs, format=format)
def render(self, name, value, attrs=None):
if value is None:
value = ''
value = self._format_value(value)
final_attrs = self.build_attrs(attrs, name=name)
return format_html('<p{}>{}</p>', flatatt(final_attrs), conditional_escape(value))
结果图片:
任何想法怎么做&#34; AdminReadonlyField&#34;&#34;任何观点或形式?
答案 0 :(得分:1)
因此,经过几个小时的寻找各种解决方案后,我发现了如何以Django方式实现这一目标。
只需将属性disabled
添加到表单中的字段(而不是小部件!):
# in __init__() with crispy-forms for instance
self.fields['field'].disabled = True
# as form field
field = forms.CharField(disabled=True)
并且它有效...... Django正在照顾不保存该字段,如果一些黑客篡改了它,尽管它被禁用了。仅适用于Django 1.9 +。