Как я добавляю информацию о простом тексте к формам в formset в Django?

Модульные тесты построены так, чтобы ожидать значения от статических ответов API в спецификации Xero OpenAPI.

https://app.swaggerhub.com/apis/Xero/accounting/2.0.0

Если вы хотите изменить тесты для своей демонстрационной компании, вы можете Начнем с изменения базового URL-адреса на https://api.xero.com/api.xro/2.0/

new ApiClient (" https: //api.xero. com / api.xro / 2.0 / ", null, null, null);

Но ваши тесты не пройдут, поскольку данные в вашей демонстрационной компании не будут соответствовать статическим ответам. Это одна из задач создания тестов для живого API. Я также обнаружил проблемы с тестированием уникальных значений в Xero. Например, имя Контакта должно быть уникальным, поэтому, как только я создам контакт с именем «Джон Смит» и проверим, что «Джон Смит» был возвращен, во второй раз, когда вы запустите этот тест, API вернет ошибку проверки, что контакт по имени "Джон Смит" уже существует.

Не говоря уже о том, что наш выбор использовать виртуальный сервер swaggerhub для размещения статических ответов - это единственный способ протестировать модели, но мы сделали выбор.

Надеюсь, эта информация поможет.

6
задан S.Lott 21 February 2009 в 00:41
поделиться

3 ответа

Вместо того, чтобы архивировать Ваши формы с дополнительными данными, можно переопределить конструктора на форме и исполнить обязанности как членские переменные уровня экземпляра. Это более объектно-ориентировано и учится, как сделать, это поможет Вам решить другие проблемы в будущем, такие как динамические поля выбора.

class MyForm (forms.Form):
    def __init__ (self, title, desc, *args, **kwargs):
        self.title = title
        self.desc = desc
        super (MyForm, self).__init__ (*args, **kwargs) # call base class

Затем в Вашем коде представления:

form = MyForm ('Title A', 'Description A')

Корректируйтесь соответственно при необходимости в этих значениях для прибытия из базы данных. Затем в Вашем шаблоне, Вы получаете доступ к переменным экземпляра точно так же, как Вы делаете что-либо еще, например:

   <h1>{{ form.title }}</h1>
   <p>{{ form.desc }}</p>

От пути Вы формулировали свой вопрос, я думаю, что у Вас, вероятно, есть некоторый беспорядок вокруг способа, которым Django использует атрибуты класса Python, чтобы предоставить декларативной форме API по сравнению с атрибутами уровня экземпляра, что Вы обращаетесь к отдельным экземплярам класса, в этом случае Ваши объекты формы.

10
ответ дан 8 December 2019 в 13:03
поделиться

Я просто создал виджет только для чтения путем разделения на подклассы поля ввода текста один:

class ReadOnlyText(forms.TextInput):
  input_type = 'text'

  def render(self, name, value, attrs=None):
     if value is None: 
         value = ''
     return value

И:

class ReportForm(forms.Form):
  comment = forms.CharField(widget=ReadOnlyText, label='comment')
6
ответ дан 8 December 2019 в 13:03
поделиться

Мне пришлось решать аналогичную задачу и понравилась ваша идея Андрей. Однако у меня были некоторые проблемы с его использованием, поскольку, если бы были ошибки проверки, значение поля только для чтения потерялось. Чтобы решить эту проблему, я сделал нечто подобное, но вместо этого переопределил HiddenInput и сохранил значение в скрытом поле формы. например:

class ReadOnlyText(forms.HiddenInput):
    input_type = 'hidden'

    def render(self, name, value, attrs=None):
        if value is None:
            value = '' 
        return mark_safe(value + super(ReadOnlyTextWidget, self).render(name, value, attrs))

class ReportForm(forms.Form):
  comment = forms.CharField(widget=ReadOnlyText, label='comment')
2
ответ дан 8 December 2019 в 13:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: