2015-03-27 2 views
0

У меня есть форма, которую мне нужно показать за пределами области администрирования, некоторые поля не могут быть отредактированы, но могут их видеть.Как использовать «Readonly Field» вне Admin

Чтобы сделать это было бы здорово «AdminReadonlyField» найдено в «django.contrib.admin.helpers» Проблема заключается в том, что вы не можете сделать.

enter image description here

Я пытался создать какой-то виджет, который может заменить этот сложный класс, но я не могу заставить его правильно работать с полями 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)) 

изображение Результат: enter image description here

любая идея, как сделать «AdminReadonlyField»»любой вид или форму

+0

Возможный дубликат [В форме django, Как сделать поле readonly (или отключено), чтобы его нельзя было отредактировать?] (Http://stackoverflow.com/questions/324477/in-a-django-form -how-to-make-a-field-readonly-or-disabled-so-that-it-can not-b) – rnevius

+0

Пожалуйста, @rnevius проверить, что мой вопрос не дублируется. – Colpaisa

ответ

0

Так после нескольких часов ищет различные решения, я узнал, как это сделать? путь Джанго

Просто добавьте атрибут 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+.

Смежные вопросы