Как переопределить виджет текстового поля формы со строкой? - PullRequest
2 голосов
/ 27 октября 2011

Все еще довольно плохо знакомы с django и python ...

Я определил две формы следующим образом:

 class PasswordForm(forms.Form):
     def __init__(self, *args, **kwargs):
         self.name={'label':'Name', 'data':''}

     def get_name(self):
         return self.name['data']

     def set_name(self, name):
         self.name['data'] = name

     name = property(get_name, set_name)

     pass1 = forms.CharField(max_length=20)
     pass2 = forms.CharField(max_length=20)


 class UserForm(PasswordForm):
     name = forms.CharField(max_length=20)

Причина, по которой я настроил это следующим образом:

  • пытается использовать один шаблон для обработки обеих форм
  • иногда требуется только проверка полей PasswordForm, иногда поля UserForm и PasswordForm, следовательно, две формы
  • в шаблоне, иногда требуется отображать имя в качестве ввода текстового поля, а иногда - просто строку, показывающую значение имени (т. Е. Недоступно для редактирования)

Я думал, что смогу зациклить что-то вроде следующего в шаблоне

 {{ form.field.label }} {{ form.field }}

В конечном итоге происходит то, что сервер разработки аварийно завершает работу (то есть 'python manage.py runserver') - никаких сообщений об ошибках, просто завершается.

Очевидно, я сделал что-то не так, но не знаю что. Можно ли переопределить ввод текстового поля строкой таким образом, чтобы шаблон не был мудрее? Если да, то как мне это сделать?

Спасибо за вашу помощь!

W.

EDIT: Согласно ответу Pasty Legs, нужно переопределить используемый виджет. Несколько настроек синтаксиса в widgets.py, чтобы он работал у меня:

 from django.forms import widgets                                                                         
 from django.utils.safestring import mark_safe 

 class StringWidget(widgets.Input):                                                                       
     def render(self, name, value, attrs=None):                                                           
         # Create a hidden field first                                                                    
         hidden_field = widgets.HiddenInput(attrs)                                                        
         return mark_safe(u'%s %s' % (value, hidden_field.render(value, attrs))) 

1 Ответ

3 голосов
/ 27 октября 2011

Почему бы просто не использовать отключенный вход вместо того, чтобы пытаться заменить его?

http://reference.sitepoint.com/html/input/disabled

class MyForm(forms.ModelForm):
    apple = models.CharField(widget=forms.TextInput(attrs={'disabled':'disabled'}))

Если вам нужно динамически решить, следует ли устанавливать ввод как отключенный (в отличие от вышеупомянутого, где он всегда отключен), вы можете перезаписать конструктор

class MyForm(forms.ModelForm):

    apple = models.CharField(widget=forms.TextInput())

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        if something:
            self.fields['apple'].widget.attrs["disabled"] = 'disabled'

EDIT Чтобы поле отображалось в виде строки, вам необходимо переопределить виджет (т. Е. HTML-код, используемый для отображения этого поля формы).Проблема в том, что если вы не включите текст в какой-либо элемент формы, он будет потерян при отправке формы.Самый простой способ обойти это - создать собственный виджет, который отображает строку и строку как скрытое текстовое поле ввода:

Создание форм widgets.py:

from django.forms import widgets
class StringWidget(widgets.Input):
    def render(self, name, value, attrs=None):
        # Create a hidden field first
        hidden_field = widgets.HiddenField(attrs) 
        return mark_safe(u'<p>%s</p>%s' % (value, hidden_field.render(value, attrs))

.py

from myapp.widgets import StringWidget
class MyForm(forms.ModelForm):

    apple = models.CharField(widget=StringWidget())

Это создаст что-то вроде следующего в вашем шаблоне, когда вы зациклите его:

<p>granny smith</p>
<input type="hidden" class="..." name="id_apple" value="granny smith" />

т.е. пользователь сможет видеть, но не редактировать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...