Colpaisa
Colpaisa

Reputation: 365

How to use "Readonly Field" outside Admin

I have a form that I need to show my project outside the area of administration, some fields can not be edited but can see them.

To do this would be great "AdminReadonlyField" found in "django.contrib.admin.helpers" The problem is that you can not do.

enter image description here

I have tried to create some widget that can replace this complex class, but I can not get it to work properly with DateTiemField fields.

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']

My code, something is not right.

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))

Result image: enter image description here

any idea how to do "AdminReadonlyField"" any view or form?

Upvotes: 0

Views: 121

Answers (1)

&#214;zer
&#214;zer

Reputation: 2106

So after hours of looking for various solutions, I found out how to do it the Django way.

Simply add the attribute disabled to the field in the form (not the widget!):

# in __init__() with crispy-forms for instance
self.fields['field'].disabled = True 

# as form field
field = forms.CharField(disabled=True) 

And it works... Django is taking care of not saving the field, if some hacker tampered with it although it's disabled. Only works with Django 1.9+.

Upvotes: 1

Related Questions