Модульные тесты построены так, чтобы ожидать значения от статических ответов 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 для размещения статических ответов - это единственный способ протестировать модели, но мы сделали выбор.
Надеюсь, эта информация поможет.
Вместо того, чтобы архивировать Ваши формы с дополнительными данными, можно переопределить конструктора на форме и исполнить обязанности как членские переменные уровня экземпляра. Это более объектно-ориентировано и учится, как сделать, это поможет Вам решить другие проблемы в будущем, такие как динамические поля выбора.
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 по сравнению с атрибутами уровня экземпляра, что Вы обращаетесь к отдельным экземплярам класса, в этом случае Ваши объекты формы.
Я просто создал виджет только для чтения путем разделения на подклассы поля ввода текста один:
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')
Мне пришлось решать аналогичную задачу и понравилась ваша идея Андрей. Однако у меня были некоторые проблемы с его использованием, поскольку, если бы были ошибки проверки, значение поля только для чтения потерялось. Чтобы решить эту проблему, я сделал нечто подобное, но вместо этого переопределил 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')